希尔排序
原理
基本思想:希尔排序是把序列按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量的逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个序列恰好被分为一组,算法便终止。
时间复杂度
平均 O(nlogn) 最坏 n^2, 不稳定
API模板
package DataStructureAndAlgorithm.Sort.HartSort;
/**
* 希尔排序
*/
public class Shell {
//排序
public static void sort(Comparable[] c){
//确定增长量h
int h=1;
while (h<c.length/2){
h=2*h+1;
}
//希尔排序
while (h>=1) {
//以每一个增长量为一组进行插入排序
for(int i=h;i<c.length;i++){
for (int j=i;j>=h;j-=h){
if(greater(c[j-h],c[j])){
exch(c,j-h,j);
}else {
break;
}
}
}
//每一个增长量排序完毕减少
h/=2;
}
}
//判断前者是否大于后者
private static boolean greater(Comparable c1 ,Comparable c2){
return c1.compareTo(c2)>0;
}
//交换顺序
private static void exch(Comparable[] c,int i,int j ){
Comparable temp =c[i];
c[i]=c[j];
c[j]=temp;
}
}