希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。它与插入排序的不同之处在于,它会优先比较距离较远的元素。希尔排序又叫缩小增量排序。
希尔排序是把记录按下表的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
代码:
private static void shellSort(int[] arr){
int N = arr.length;
for(int gap =N/2;gap>0;gap/=2){
//分组在进行插入排序
for(int i =gap;i<N;i++){
insertI(arr,gap,i);
}
}
}
private static void inserI(int[] arr,int gap,int i){
int inserted = arr[i];
int j;
for(j=i-gap;j>0&&inserted<arr[j];j-=gap){
arr[j+gap] =arr[j];
}
arr[j+gap]=inserted;
}
算法分析:
最佳情况:T(n) = O(nlog2 n) 最坏情况:T(n) = O(nlog2 n) 平均情况:T(n) =O(nlog2n)