希尔排序是一种基于插入排序的算法,通过把一个数组分成几个小数组,间隔为h,即:
假设h为4
A B C D E F G H I J K F L M N O
① A--------------E-------------I------------L
② B-------------F------------J-------------M
③ C-------------G-----------K-------------N
④ D------------H------------F-------------O
①②③④都是间隔为h的小数组。
用插入排序将h个小数组独立排序,因为h-子数组是独立的,可以在h-子数组中,将每一个元素交换到比它大的元素之前去。然后
不断循环交换,直到h减到为1,排序完成。
代码:
#include<iostream>
using namespace std;
int a[31];
int n;
void set(int *a)
{
int h = n;
int i, j;
do
{
h = h / 3 + 1;//增量
for (i = h + 1; i <= n; i++)
{
if (a[i] < a[i - h])//要是前一个比后一个大就交换
{
//交换元素
a[0] = a[i];
for (j = i - h; j > 0 && a[0] < a[j]; j -= h)//这里循环是为了将间隔为h的整个小数组都进行排序
{
a[j + h] = a[j];
}
a[j + h] = a[0];
}
}
for (int i = 1; i <n; i++)
{
cout << a[i] << " ";
}
cout << a[n] << endl;
} while (h > 1);
}
int main()
{
n = 1;
while (cin >> a[n++]);//边输入边记录元素个数
n -= 2;
set(a);
return 0;
}