希尔排序
- 核心思想:
其实就是直接排序的升级版,把序列按照一定的增量分组,各小组之间用直接排序的方法排好序,接着把增量缩小,重复此过程,直到最后增量为1
- 复杂度分析:
- 希尔排序是相隔某个增量的记录而组成的一个子序列,实现跳跃式的移动,使得效率提高
- 迄今为止没找到最优的增长序列,但增量序列的最后一个值必须为1
- 最好:
O(n^3/2)
- 最差:
O(n^2)
- 平均:
O(nlogn)~O(n^2)
- 时间复杂度为
O(n^3/2)
,好于直接排序 - 是第一个突破
O(n^2)
的排序算法 - 辅助空间:
不稳定
- 稳定性:
不稳定
图示
代码如下
#include <iostream>
void swap(int *&arr,int i,int j){
int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
void shellSort(int *arr,int n){//希尔排序,其实就是直接插入排序(摸牌)的进阶版
int i,j,increate;//把数组序列通过增量切分成多块,每一份中利用直接插入排序
for(increate=n/2;increate>0;increate/=2){
for(i=increate;i<n;i++){//一个增量下排好序后就继续缩小增量,继续循环执行
j=i;
while(j-increate>=0&&arr[j]<arr[j-increate]){
swap(arr,j,j-increate);
j-=increate;
}
}
}
}
void print(int *arr,int n){
for(int i=0;i<n;i++){
printf("%d ",arr[i]);
}
}
int main(int argc, char** argv) {
int arr[]={4,56,23,98,45,5,6,87};
shellSort(arr,8);
print(arr,8);
return 0;
}
注:本文所用图为dreamcatcher-cx大神的博客