当一个系列有序时,用直接插入排序的时间复杂度为O(N2)。当系列基本有序时,用直接插入排序的效率也较高.由于直接插入排序简单,且当系列的规模较小时效率比较高,希尔排序正是从这两点出发对直接插入排序进行改进得到的一种排序方法。
希尔排序的基本思想是:先将整个待排记录系列分割成若干个子系列分别进行直接插入排序,待整个系列中的记录"基本有序"时,再对全体记录进行一次直接插入排序.
注意:希尔排序是不稳定的排序方法. 时间复杂度 平均时间 O(nlogn) 最差时间O(n^s) 1<s<2
希尔排序算法描述余下:
// 希尔排序.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <iostream>
using namespace std;
//增量为dc的一趟希尔排序
void ShellInsert(int *a,int len,int dc)
{
for(int i=dc;i<len;i++)
{
if(a[i]<a[i-dc])
{
int temp=a[i];
int j=i-dc;
for(;j>=0 && temp<a[j];j-=dc)
{
a[j+dc]=a[j];
}
a[j+dc]=temp;
}
}
}
//希尔排序
void ShellSort(int * a,int len,int *dlta,int t)//dlta为增量序列数组,t为dlta的长度
{
for(int i=0;i<t;i++)
ShellInsert(a,len,dlta[i]);
}
void printArray(int * a,int n)
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={49,38,65,97,76,13,27,49,55,04};
int len=sizeof(a)/sizeof(int);
int dlta[]={5,3,1};
int t=sizeof(dlta)/sizeof(int);
printArray(a,len);
ShellSort(a,len,dlta,t);
printArray(a,len);
system("PAUSE");
return 0;
}