希尔排序,又称作”缩小增量法排序“,思路是不断把待排序的数组记录按间隔值(然后按下标)分成若干个小组,然后对同一个小组进行排序。设间隔值d(j-i=d)(此处数据存储在下标从1开始的数组中,容易理解。)
思路如下图:
代码如下:
#include <iostream>
#include <algorithm>
#include <stdio.h>
const int maxn = 1000+10;
int arr[maxn];
using namespace std;
void ShellSort(int arr[], int n)
{
int d=n,flag;
while(d>=1){
d=d/2;
flag=0;
while(!flag){
flag = 1;
for(int i=1; i<=n-d; i++){
int j=i+d;
if(arr[i]>arr[j]){
swap(arr[i],arr[j]);
flag = 0;
}
}
}
}
}
int main()
{
int n;
while(cin>>n){
for(int i=1; i<=n; i++)
cin>>arr[i];
ShellSort(arr, n);
for(int i=1; i<=n; i++)
cout<<arr[i]<<" ";
cout<<endl;
}
return 0;
}
d的值大于等于1,小于等于n/2,每次取上一次的一半。
i<=n-d 和 j=i+d保证了数组没有中断,且没有越界
while(!flag)这一层循环是为了保证每个d间隔下,所排列的数都满足要求,即每d个间隔的数左边的小于右边。这样在d=2的时候(即两个数中间有一个数)就能把数按顺序排好,(d=1已经不需要考虑了吗?)
如有不对欢迎指出。