希尔排序
1、简介
希尔排序(Shell Sort),也称为递减增量排序算法,是插入排序的一种高速而稳定的改进版本。希尔排序是基于插入排序的以下两点性质而提出改进方法的:
1.插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
2.但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位。
2、代码
代码如下:
template<class T>
int ShellSort(T *aArray, int aCount)
{
if(0 == aCount || NULL == aArray)
return sERROR;
for(int gap = aCount/2; gap > 0; gap/=2) //先两个数值排序,然后倍量处理
{
for(int i = gap; i < aCount; i++) //gap所在的组,进行直接插入排序
{
int j = i;
T temp = aArray[j];
if(aArray[j] < aArray[j - gap])
{
while(j - gap >= 0 && aArray[j - gap] > aArray[j])
{
aArray[j - gap] = aArray[j - gap] + aArray[j]; //交换
aArray[j] = aArray[j - gap] - aArray[j];
aArray[j - gap] = aArray[j - gap] - aArray[j];
j = j - gap;
}
}
aArray[j] = temp;
}
}
return sSUCCESS;
}
1.先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中,在各组内进行直接插入排序。
2.取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
3、引用
使用方法如下:
int main(int argc, char ** argv)
{
int iArray[] = { 49,38,65,97,76,13,27,49,10 };
int iSize = sizeof(iArray) / sizeof(int);
cout <<"排序前:"<<endl;
PrintArray<int>(iArray, iSize);
ShellSort<int>(iArray, iSize);
cout <<"排序后:"<<endl;
PrintArray<int>(iArray, iSize);
double dArray[] = { 12.3,90.0,123.44,22.5,99.4,34.6,23.3,78.5,20.0 };
int dSize = sizeof(dArray) / sizeof(double);
cout <<"排序前:"<<endl;
PrintArray<double>(dArray, dSize);
ShellSort<double>(dArray, dSize);
cout <<"排序后:"<<endl;
PrintArray<double>(dArray, dSize);
return sSUCCESS;
}
1、第一部分为int类型的数组排序。
2、第二部分位double类型的数组排序。
4、运行结果
5、总结
1、步长的选择是希尔排序的重要部分。只要最终步长为1任何步长串行都可以工作。算法最开始以一定的步长进行排序。然后会继续以一定步长进行排序,最终算法以步长为1进行排序。当步长为1时,算法变为插入排序,这就保证了数据一定会被排序。
2、平均时间复杂度:O(nlogn)
3、稳定性:不稳定
6、git地址如下
https://github.com/FengAfra/WorkSpace/tree/dev/Arithmetic/ShellSort