基本思想:
先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为dl的倍数的记录放在同一个组中。先在各组内进行直接插人排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-l<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
给定实例的shell排序的排序过程
假设待排序文件有10个记录,其关键字分别是:
49,38,65,97,76,13,27,49,55,04。
增量序列的取值依次为:
5,3,1
不太清楚原理最好看看:排序过程如【动画模拟演示】
经过了半天的折腾终于搞定了,下面是我的代码
#include<iostream>
using namespace std;
void ShellSort(int arr[], int len);
void main()
{
int a[]={49,38,65,97,76,13,27,49,55,04};
ShellSort(a,10);
cout<<"排序完成后"<<endl;
for (int i=0; i<10; i++)
{
cout<<a[i]<<endl;
}
system("pause");
}
void ShellSort(int arr[], int len)
{
int j,k,temp;
j = len/2;
for (j; j>= 1; j /=2)//确定增量
{
for (k =j; k<len;k++)//从数组增量到末尾的判断
{
if (arr[k] < arr[k-j])//对分组的进行插入排序
{
temp = arr[k];
int s =k-j;
while (arr[s] > temp)
{
arr[s +j] = arr[s];
s-=j;
}
arr[s+j] = temp;
}
}
cout<<"**********"<<"增量"<< j << "**********"<<endl;
for (int g=0; g<10; g++)
{
cout<<arr[g];
cout<<",";
}
cout<<""<<endl;
}
}
原文:http://blog.csdn.net/u010236550/article/details/18264273