您的位置:首页 > 运维架构 > Shell

排序之希尔排序(Shell Sort)

2013-12-08 15:32 489 查看
希尔排序(Shell Sort):又叫缩小增量排序,该方法是直接插入排序的改进,其实质就是分组直接插入排序

我们还记得直接插入排序对基本有序的序列排序时,效率很高;由此思想得出希尔排序;

基本思想:

    先将待排序序列分成若干个子序列(由相距同等增量的元素组成),然后分别对分组序列进行直接插入排序;

     缩小增量,依据增量再次分组排序。待到整个序列基本有序时,整体进行直接插入排序;

算法操作步骤:

    1)选择某一增量序列:gap1 , gap2......gapk,其中gapi > gapj,gapk = 1;

     2)按照给定增量序列个数K,需要进行K趟排序;

     3)每趟排序中,根据给定增量gapi,将序列分成程度为m的不同子序列,对子序列进行直接插入排序;

算法实现:

#include<iostream>
using  namespace std;
//-------------------------------------------------------希尔排序 --------------------------------------------------------------------------
void ShellSort_Soulation1(int* data , int dLength)
{
if(data == NULL ||dLength <= 0)
return;

int i , j , gap;

//gap 步长
for(gap = dLength / 2; gap > 0; gap /= 2)
for(i = 0; i < gap; i++)
{
//小组插入排序
for(j = i + gap; j < dLength; j += gap)
{
if(data[j] < data[j - gap])
{
int temp = data[j];
int k = j - gap;
while(k >=0 && data[k] > temp)
{
data[k + gap] = data[k];
k -= gap;
}

data[k + gap] = temp;

}
}

}
}

void ShellSort_Soulation2(int* data , int dLength)
{
if(data == NULL || dLength <= 0)
return;

int i , j , gap;
for(gap = dLength / 2; gap > 0; gap /= 2)
for(i = gap; i < dLength; i++)
for(j = i - gap; j >= 0 && data[j] > data[j + gap]; j -= gap)
//数据交换代替数据依次后移,会简洁些;
swap(data[j] , data[j + gap]);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: