老师 我自己尝试了好几次 写了一会 感觉哪里总不太对 思维有点局限 一时半会没有想出来?
来源:1-1 最简单的排序算法:选择排序法
licslan
2020-08-13 17:07:25
public static int[] sortAfter(int[] sortBefore){ //3,4,1,5 先把最小拿出来 剩下的,再把其中最小的拿出来 ...... 每次选择还没处理的元素里最小的元素 int[] sortAfter = new int[0]; if (sortBefore.length>0) { //初始化一个排序后的数组 sortAfter = new int[sortBefore.length]; //初始化一个新数组 用装少了当时最小值的数组 int[] newArr = new int[0];//这个数组没有用上呀 ??? int length = sortBefore.length; for (int k=0;k<sortAfter.length;k++) { //遍历这个数组 并生成一个新数组 for (int i = 0; i < sortBefore.length; i++) { //拿一个值认为是最小值 int min = sortBefore[0]; //找出最小值 if(sortBefore[i]<=min){ sortAfter[k]=sortBefore[i]; sortBefore[i]=sortBefore[i+1];//??? 这部分逻辑感觉没有处理对 一时半会没有想出来 } } //遍历完了 长度减一 length --; } } return sortAfter; }
2回答
licslan
提问者
2020-08-13
老师 看了后面讲的 但这种感觉自己写的好像差了不少(代码量多了些感觉)下午也写了好久 ^_^
/**
* 选择排序非原地排序实现 (递归)
* */
public static ArrayList sortAfter(int[] sortBefore,ArrayList list){
//3,4,1,5 先把最小拿出来 剩下的,再把其中最小的拿出来 ...... 每次选择还没处理的元素里最小的元素
int minIndex = sortBefore[0];//定义最小值为该数组的第一个数
int indexDel=0;//要删除元素的下标
//遍历循环数组
for (int i = 0; i < sortBefore.length; i++) {
if(minIndex > sortBefore[i]){minIndex = sortBefore[i]; indexDel=i;}//The index need to be deleted
}
list.add(minIndex);
//删除指定元素的生成新的数组
int[] intNew = delAnyPos(sortBefore, indexDel);
if(intNew.length>0) {
sortAfter(intNew, list);
}
return list;
}
/**
* 删除指定数组的指定下标元素
* */
public static int[] delAnyPos(int[] arr,int position){
//判断是否合法
if(position >= arr.length || position < 0){
return null;
}
int[] res = new int[arr.length - 1];
for(int i = 0;i<res.length;i++){
if(i < position){
res[i] = arr[i];
}else{
res[i] = arr[i + 1];
}
}
return res;
}
public static void main(String[] args) {
int[] ints = {1, 34, 4, 5};
//非原地实现选择插入元素
ArrayList arrayList = new ArrayList();
ArrayList arrayAfter = sortAfter(ints, arrayList);
for (int i = 0; i < arrayAfter.size(); i++) {
System.out.println(arrayAfter.get(i));
}
}
liuyubobobo
2020-08-13
继续看下一小节呀,后续我就会给出课程的选择排序的参考实现,届时再来比对自己的思路,看看自己的思路哪里有问题?
继续加油!:)
相似问题