基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。根据需求,如果你想要结果从小到大排列,它会首先将数组进行分组,然后将较小值移到前面,较大值移到后面,最后将整个数组进行插入排序,这样比起一开始就用插入排序减少了数据交换和移动的次数,可以说希尔排序是加强 版的插入排序 拿数组5, 2,8, 9, 1, 3,4来说,数组长度为7,当increment为3时,数组分为两个序列5,2,8和9,1,3,4,第一次排序,9和5比较,1和2比较,3和8比较,4和比其下标值小increment的数组值相比较此例子是按照从小到大排列,所以小的会排在前面,第一次排序后数组为5, 1, 3, 4, 2, 8,9第一次后increment的值变为3/2=1,此时对数组进行插入排序, 实现数组从大到小排。
Java实现:
public class ShellSort {
public static void shellSort(int []numbers) {
int temp=0;
int j=0;
//每次将步长缩短为原来的一半
for(int increment=numbers.length/2;increment>0;increment/=2) {
for(int i=increment;i<numbers.length;i++) {
temp=numbers[i];
for(j=i;j>=increment;j-=increment) {
//numbers[j]比前面的numbers[j-increment]小;交换
if(numbers[j]<numbers[j-increment]) {
numbers[j]=numbers[j-increment];
}else {
break;
}
}
numbers[j]=temp;
}
}
}
}
各种算法时间复杂度比较:
来源:https://blog.csdn.net/weidiezeng/article/details/101263866