希尔排序
基本思想:
将待排序的序列分为若干组,在每组内进行直接插入排序,以使整个序列基本有序,然后再对整个序列进行直接插入排序。
该方法实质上是一种分组插入方法。
具体来说,先取一个小于n的整数d1作为增量,把文件的全部记录分组。所有距离为d1的倍数的记录放在同一个组中。现在各组内进行直接插入排序;然后,取第二个增量d2<d1重复以上的分组和排序,直至所取的增量dt=1,即所有的记录放在同一个组中进行直接插入排序为止。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1.
这里首先希尔排序的思想是建立在插入排序的基础上的,所以补充讲一下直接插入排序。基本思想:将整个待排序的子表看成是左右两个部分,其中左边为有序区,右边是无序区,整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,以构成新的有序区。
因为插入排序遇到相等的元素就停止了,所以插入排序是稳定的排序算法。
希尔排序的时间复杂度:O(n*lgn) (lg是log以2为底)
稳定性分析:不稳定的排序算法
#include <iostream>
using namespace std;
void shell_sort(int *A,int length){ //希尔排序
int dh = length/2; //dh为步长,一般选择数组长度的一半
int i,j;
while(dh>=1){
for(i=dh;i<length;i++){
int temp = A[i];
j = i - dh;
while(j>=0 && A[j]>temp){
A[j+dh] = A[j];
j = j - dh;
}
A[j+dh] = temp;
}
dh = dh/2;
}
}
int main(){
int A[] = {2,1,3,7,4,5,9,6,8};
int length = sizeof(A)/sizeof(int);
shell_sort(A,length);
for(int i=0;i<length;i++){
cout<<A[i]<<" ";
}
return 0;
}
希尔排序的图形化表示: