希尔排序也叫i缩小增量排序,是一种比较高效的排序算法。平均时间复杂度为O(n^1.3),最坏的情况也是O(n^2)
思想是隔着一定步长进行取出几组数据,对取出的几组数据进行直接插入排序。
举个栗子:
有数组:a[10]={10,5,8,4,68,7,99,101,3,4,1,5,7,68,7,13}
第一步、如果我们以步长为5的,隔着取出几组数据
分别得到
10 5 8 4
7 99 101 3
1 5 7 68
13
我们分别对这几列进行直接插入排序
得到
1 5 7 3
7 5 8 4
10 99 101 68
13
第二步,把已经分别排序的数组进行连接
变成 {1,5,7,3,7,5,8,4,10,99,101,68,13}
这次我们以步长为2取出几组数据
1 5
7 3
7 5
8 4
10 99
101 68
13
重复上面步步骤知道步长为1
最后就是直接插入排序了
关键代码:
void Mysort(int arr[],int n)
{
int i,j,k,t;
k=n/2;
while(k>0)
{
//对每一组的进行直接插入排序
for(i=k;i<n;i++)
{
t=arr[i];
j=i-k;
while(j>=0&&arr[j]>t)
{
arr[j+k]=arr[j];
j-=k;
}
arr[j+k]=t;
}
//调整步长
k/=2;
}
}
完整代码:
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#define NUMSIZE 20000
void Mysort(int arr[],int n)
{
int i,j,k,t;
k=n/2;
while(k>0)
{
//对每一组的进行直接插入排序
for(i=k;i<n;i++)
{
t=arr[i];
j=i-k;
while(j>=0&&arr[j]>t)
{
arr[j+k]=arr[j];
j-=k;
}
arr[j+k]=t;
}
//调整步长
k/=2;
}
}
int main(int argc, char* argv[])
{
float nstart=clock();
srand((unsigned)time(NULL));
//产生2万个随机数 希尔排序
int a[NUMSIZE];
for (int i=0; i<NUMSIZE; i++)
a[i]=rand()%NUMSIZE; //产生0-20000
Mysort(a,NUMSIZE);
for( i=0;i<NUMSIZE;i++)
printf("%d\n",a[i]);
float nend=clock();
printf("运行时间:%fs\n",(nend-nstart)/1000);
return 0;
}
20000个数据的运行时间: