希尔排序(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]);
}