希尔排序

来源:互联网 发布:淘宝超级店长使用教程 编辑:程序博客网 时间:2024/05/29 17:36

希尔排序,又称作”缩小增量法排序“,思路是不断把待排序的数组记录按间隔值(然后按下标)分成若干个小组,然后对同一个小组进行排序。设间隔值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已经不需要考虑了吗?)

如有不对欢迎指出。

0 0