您的位置:首页 > 其它

基本排序方法之四——希尔排序

2015-08-01 17:08 246 查看
希尔排序(shell sort)又称缩小增量排序(diminishing increment sort),是希尔于1959年对直接插入排序进行改进后提出来的。

希尔排序的基本思想:首先取一个小于n的整数d1作为第一个增量,把全部记录分为d1个组,所有间隔为d1的记录放在同一个组中,在各组内进行直接插入排序(也可采用冒泡排序等其他排序方法),这样一次分钟排序的过程称为一趟排序;然后取第二个增量d2<d1重复上述的分组和排序,直到所取的增量dm=1,即所有记录放在同一组中进行直接插入排序为止。

希尔排序实质上是一种分组插入排序方法,每趟排序过程中,它不是朱各元素进行比较,而是先将整个待排序记录序列分割成若干个子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。

在希尔排序中,增量序列可以有各种取法,但应该遵循使增量序列中的值没有除1之外的公因子,并且最后一个增量的值必须为1的原则。

希尔排序的C语言实现如下:

/************************ 希尔排序(缩小增量排序) ************************
函数名称:void ShellSort(int a[], int len)
参    数:int a[]---待排序的数据
int len---待排序数据的个数,也即数组a的长度
功    能:完成希尔排序(缩小增量排序)
返 回 值:无
说    明:排序好的数据依然存放在数组a中
*************************************************************************/
void ShellSort(int a[], int len)
{
int i, j, d, temp; // temp为哨兵  d为增量
for(d=len/2; d>=1; d/=2)  // 增量值有多少个,就进行多少趟排序
{
// 当d=1时,下面的二重for循环就是直接插入排序(简单插入排序)
for(i=d; i<len; i++) // 每趟最多进行len-d次排序
{
temp = a[i];  // 将每次待排序的元素复制为哨兵
for(j=i-d; j>=0&&a[j]>temp; j-=d)  // 从a[i-d]到a[0]逐个与哨兵(a[i])比较,大于哨兵的就后移
a[j+d] = a[j];				  // 直到遇到小于或等于哨兵的元素或是遇到a[0]
a[j+d] = temp;  // 将哨兵(也即待排序的元素)插入到第一个小于或等于哨兵元素之后
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: