1、介绍
希尔排序是插入排序的一种,是针对直接插入排序算法的改进,又称为缩小增量排序。主要思想:把记录按下标的一定增量分组,对每组使用直接插入排序,随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分为一组,算法便终止。
2、shell sort算法实现
//Shell排序的算法实现:
void ShellPass(SeqList R,int d)
{
//希尔排序中的一趟排序,d为当前增量
for(i=d+1;i<=n;i++) //将R[d+1..n]分别插入各组当前的有序区
if(R[i].key<R[i-d].key)
{
R[0] = R[i];j = i-d; //R[0]只是暂存单元,不是哨兵
do
{
//查找R的插入位置
R[j+d] = R[j]; //后移记录
j = j-d; //查找前一记录
}while(j>0&&R[0].key<R[j].key);
R[j+d] = R[0]; //插入R到正确的位置上
}
}
3、排序过程如图所示:
4、程序实现:
#include<iostream>
#define SIZE 101
using namespace std;
void ShellSort(int *arr,int n)
{
int i,j,x,d;
d = n/2;
while(d >= 1)
{
for(i=d+1;i<=n;i++)
{
x = arr[i];
j = i - d;
while((j > 0) && (x < arr[j]))
{
arr[j+d] = arr[j];
j -= d;
}
arr[j+d] = x;
}
d /= 2;
}
}
int main()
{
int number[SIZE];
int n,i;
cout << "please input n:";
cin >> n;
cout << "please input sort data:";
for(i=1;i<n;i++)
{
cin >> number[i];
}
ShellSort(number,n);
cout << "after sort:" <<endl;
for(i=1;i<n;i++)
{
cout << number[i] << " ";
cout << endl;
}
}