目录
前言
希尔排序是直接插入排序的增量缩小版,它也是不稳定的一种排序算法
一、算法思想
上节将到了直接插入排序的思想(排序算法之直接插入排序),而希尔排序可以看成是往直接插入排序算法上提升了一层。根据思想,希尔排序首先第一步就是分组,如下图:
比如元素总共有8个,则步骤如下:
首先分组间隔为8/2=4,下标0与4一组,1与5一组,2与6一组,3与7一组。分别进行比较。
其次再将分组间隔减半为4/2=2,再次分组进行比较。
直到分组间隔为1,则在进行直接插入排序。
二、代码编写
1.代码如下
先康康直接插入排序的算法
void Insert1(int _srcArray[],int _nLength)
{
int i, j, key;
for (i = 1; i <_nLength; i++) {
key = _srcArray[i]; //获取当前参考量
for (j = i - 1; j >= 0; j--) //参考量 与它前面的进行比较
{
if (_srcArray[j] > key) //如果比参考量大,则往后移动
{
_srcArray[j + 1] = _srcArray[j];
} //如果直到找到比它小的位置退出循环
else
break;
}
_srcArray[j + 1] = key;//此时将参考量放在这个位置
}
}
我们上面上过,希尔排序是在直接插入排序的上一层,直接插入排序的gap也就是分组间隔为1,而希尔排序则是变动的,所以给抽象出来。如下图:
void ShellSort(int nTength1)
{
int array2[8] = {10,82,93,4,25,182,441,14747};
//当gap为1时,其实就是直接插入排序
for (int gap=nTength1/2;gap>0;gap=gap/2)
{
int i, j, key;
for (i = gap; i < nTength1; i++) {
key = array2[i]; //获取当前参考量
for (j = i - gap; j >= 0; j-= gap) //参考量 与它前面的进行比较
{
if (array2[j] > key) //如果比参考量大,则往后移动
{
array2[j + gap] = array2[j];
} //如果直到找到比它小的位置退出循环
else
break;
}
array2[j + gap] = key;//此时将参考量放在这个位置
}
}
}
总结