一、希尔排序
(1)基本思路:希尔排序又称最小增量排序,
先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
(2)代码实现:
//希尔排序
public static void shellSort(List<Integer> list){
int[] aa = {9,8,12,7,6,5 };
int i,j;
int len = aa.length;
while(len>=1){
len = len/2; //设置增量
//把距离为len的元素分为一组,循环所有组
for(i=len;i<aa.length;i++){
//对相隔为len的元素进行直接插入排序
if(aa[i-len]>aa[i]){
int temp = aa[i];
for(j=i-len;j>=0&&aa[j]>temp;j-=len){
aa[j+len] = aa[j];
}
aa[j+len] = temp;
}
}
}
for (int k = 0; k < aa.length; k++) {
System.out.println(aa[k]);
}
}
(3)小结:
之前的许多算法时间复杂度基本都为 O(n²),希尔提出的希尔算法将时间复杂度有所突破,
时间复杂度: O(n 3/2),
不稳定排序算法。增量的选择也会影响希尔算法的性能,
总体来说希尔排序效率高于直接插入排序。直接插入排序
适用于链式存储结构,希尔排序不适用于链式存储结构。