shell排序算法
希尔排序(Shell Sort)又称为“缩小增量排序”。是1959年由D.L.Shell提出来的。该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排序在时间效率上比前两种方法有较大提高。
具体做法:首先确定一组增量d0,d1,d2,d3,...,dt-1()其中n>d0>d1>...>dt-1=1),对于i=0,1,2,...,t-1,依次进行下面的各趟处理:根据当前增量di将n个元素分成di个组,每组中元素的下标相隔为di;再对各组中元素进行直接插入排序.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <iostream>
2
3 using namespace std;
4
5 //shell排序的一趟,d为当前增量
6 void shellPass(int a[],int d,int n)
7 {
8 int i,j,key;
9 for(i = d;i < n;i++)//增量之后的所有记录在自己所在组的进行插入排序
10 {
11 key = a[i]; //当前记录
12 for(j = i-d;j>=0&&a[j]>key;j-=d)
13 a[j+d] = a[j];
14 a[j+d] = key; //定位当前记录
15 }
16 }
17
18 void shellSort(int a[],int n)
19 {
20 int inc = n;
21 do{
22 inc = inc/3+1; //下一趟增量
23 shellPass(a,inc,n);
24 }while(inc > 1);
25 }
26
27 int main(int argc,char **argv)
28 {
29 int a[] = {43,2,56,4,3,43};
30 shellSort(a,6);
31 for(int i = 0;i < 6 ;i++)
32 cout<<a[i]<<" ";
33 cout<<endl;
34 return 0;
35 }