目录
基本思想
- 使数组中间隔为d的元素有序。开始时,d选择大一些,每组的元素少,但是组数多。之后不断的缩小d,此时每组的元素变多,而组数变少。当d=1时,只有一个组,所有元素都在这个组中,此时排序完成。
- 举例
C++实现
/*算法:希尔排序*/
#include <iostream>
using namespace std;
/*********************************************************
Function:swap
Description:交换a,b两个变量的值
**********************************************************/
void swap(int & a,int & b){
int tmp = a;
a = b;
b = tmp;
}
/*********************************************************
Function:shsort
Description:希尔排序
Input:数组A[l,h]
Output:排序完成的数组A
*********************************************************/
void shsort(int A[],int l,int h){
if(l<h){
int d;//增量
int tmp;
int j;
int size = h-l+1;
for(d=size/2;d>=1;d/=2){
//组内使用插入排序
//d+l是第1组的第2个元素
for(int i=d+l;i<=h;i++){
tmp = A[i];
j=i-d;//该组中,当前元素的前一个元素
//寻找要插入的位置
while(j>=l&&A[j]>tmp){
swap(A[j],A[j+d]);
j = j - d;
}
A[j+d] = tmp;
}
}
}
}
int main(){
int A[] = {3,1,2,8,-4,0,11};
shsort(A,0,6);
for(int i=0;i<7;i++)
cout<<A[i]<<" ";
}
时间复杂度
希尔排序中增量的选择会影响时间复杂度,像上面的那种逐步折半的增量,最坏的时间复杂度为。经过优化的增量序列,可以使算法在最坏情况下的时间复杂度为