标签:log alt shel 技术 技术分享 namespace name ++ 基本
在第一篇博客中论述了几种排序的方法,这里再论述一下另外一种排序方法:希尔排序
希尔(Shell)排序又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。
希尔排序的基本思想是:
把记录按步长 gap 分组,对每组记录采用直接插入排序方法进行排序。
随着步长逐渐减小,所分成的组包含的记录越来越多,当步长的值减小到 1 时,整个数据合成为一组,构成一组有序记录,则完成排序。
如下图所示:

因此,增量的选择很重要,如果增量的选择不合适,时间复杂度依然很高。
代码实现如下:
#include<iostream>
using namespace std;
int A[13] = {81,94,11,96,12,35,17,95,28,58,41,75,15};
//书上的版本
void Shellsort(int A[], int N)
{
int i, j, Increment;
int Tmp;
for(Increment = N / 2; Increment > 0; Increment /= 2 ) //增量的变换
{
for (i = Increment; i < N; i++)
{
Tmp = A[i];
for(j = i; j >= Increment; j -= Increment)
if(Tmp < A[j - Increment])
A[j] = A[j - Increment];
else
break;
A[j] = Tmp;
}
}
}
//我自己写的版本
void My_Shellsort(int A[], int N)
{
int i, j;
int Increment = N / 2;
int Tmp;
while(1 <= Increment)
{
for(i = Increment; i < N; ++i)
{
Tmp = A[i];
for(j = i - Increment; j >= 0 && Tmp < A[j]; j = j - Increment)
{
A[j + Increment] = A[j];
}
A[j + Increment] = Tmp;
}
Increment = Increment / 2;
}
}
int main ()
{
//Shellsort(A, 13);
My_Shellsort(A, 13);
for(int i = 0; i != 13; ++i)
{
cout << A[i] << " ";
}
cout << endl;
return 0;
}
希尔排序相当于改进版本的插入排序。
夜深了,,,
我还要预见几个你,才可以忘记你。
标签:log alt shel 技术 技术分享 namespace name ++ 基本
原文地址:http://www.cnblogs.com/1242118789lr/p/6842373.html