引言
紧接上文,我们再来讲解一下两种排序:希尔排序、简单选择排序
希尔排序
1.思路
希尔排序离不开插入排序,整体思路是先选一个递减的间隔序列,按照间隔分组,每组做插入排序,间隔不断缩小,直到间隔为1就完成了整体插入排序
具体的插入排序流程请看上文,这里博主依旧写步骤带大家清晰的看一下排序逻辑:
待排序数组:[8, 9, 1, 7, 2, 3, 5, 4, 6, 0]
长度 n = 10
间隔 gap:5->2->1
gap=5:
组 1:下标 0,5 → [8, 3]
组 2:下标 1,6 → [9, 5]
组 3:下标 2,7 → [1, 4]
组 4:下标 3,8 → [7, 6]
组 5:下标 4,9 → [2, 0]
每组分别插入排序:
[8,3] → [3,8]
[9,5] → [5,9]
[1,4] → [1,4]
[7,6] → [6,7]
[2,0] → [0,2]
排序后数组为:[3, 5, 1, 6, 0, 8, 9, 4, 7, 2]
gap=2(差距为2,但是要一直++,所以隔一个元素为一组)
组 1:下标 0,2,4,6,8 → [3, 1, 0, 9, 7]
组 2:下标 1,3,5,7,9 → [5, 6, 8, 4, 2]
分别插入排序:
组 1:[3,1,0,9,7]
1 插入 → [1,3,0,9,7]
0 插入 → [0,1,3,9,7]
9 不动
7 插入 → [0,1,3,7,9]
组 2:[5,6,8,4,2]
6 不动
8 不动
4 插入 → [4,5,6,8,2]
2 插入 → [2,4,5,6,8]
排序后数组:[0, 2, 1, 4, 3, 5, 7, 6, 9, 8]
gap=1(此时就是普通插入排序)
此处省略,不懂请看上文
2.代码
//希尔排序
for(int h=n/2;h>=1;h/=2){
for(int j=h;j<n;j++){
for(int i=j-h;i>=0;i-=h){
if(arr[i]>arr[i+h]){
int temp=arr[i];
arr[i]=arr[i+h];
arr[i+h]=temp;
}
}
}
}
简单选择排序
1.思路
先假设minIndex为 i ,从下标为 i=0 位置开始,找到 i 之后数组的最小值,找到就和minIndex交换数值,记录该轮的最小值和指针 i 所指元素进行交换,交换完 i 往后走,重复以上步骤,这样就实现了每一轮都找到了最小值(当前),找到就依次放前面
这里博主手写了两轮的逻辑,剩下以此类推:

2.代码
java
//简单选择排序
for(int i=0;i<n;i++){
int minIndex=i;
for(int j=i+1;j<n;j++){
if(arr[j]<arr[minIndex]){
minIndex=j;
}
}
int temp=arr[i];
arr[i]=arr[minIndex];
arr[minIndex]=temp;
}
小舟有话说
还有其他排序,博主会一一讲解的,这个排序的代码初学者尽量默写下来,这个还是很重要的!如果觉得博主写的不错,点点赞点点关注吧,下次找我不迷路~