SDUT-3403 数据结构实验之排序六:希尔排序

来源:互联网 发布:网上卖的淘宝教程没用 编辑:程序博客网 时间:2024/06/13 21:35

数据结构实验之排序六:希尔排序

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

Problem Description

我们已经学习了各种排序方法,知道在不同的情况下要选择不同的排序算法,以期达到最好的排序效率;对于待排序数据来说,若数据基本有序且记录较少时, 直接插入排序的效率是非常好的,希尔排序就是针对一组基本有序的少量数据记录进行排序的高效算法。你的任务是对于给定的数据进行希尔排序,其中增量dk=n/(2^k)(k=1,2,3……)

Input

连续输入多组数据,每组输入数据的第一行给出一个正整数N(N <= 10000),随后连续给出N个整数表示待排序关键字,数字间以空格分隔。

 

Output

输出dk=n/2和dk=1时的结果。

Example Input

1010 9 8 7 6 5 4 3 2 110-5 9 7 -11 37 -22 99 288 33 66

Example Output

5 4 3 2 1 10 9 8 7 61 2 3 4 5 6 7 8 9 10-22 9 7 -11 37 -5 99 288 33 66-22 -11 -5 7 9 33 37 66 99 288

Hint

 

Author

xam
可参考:http://blog.csdn.net/morewindows/article/details/6668714
#include <bits/stdc++.h>using namespace std;int a[11111],n,b[11111];int judge(int x,int y){    if(x<y)        return 1;    else        return 0;}void shell(int dk){    int k;    for(int i=1; i<=dk; i++)    {        for(int j=i+dk; j<=n; j+=dk)        {            if(a[j]<a[j-dk])            {                a[0]=a[j];                for(k=j-dk; judge(a[0],a[k])&&k>=1; k=k-dk)///注意k=k-dk                {                    a[k+dk]=a[k];                }                a[k+dk]=a[0];///因为a[k]<a[0],所以a[0]要放到a[k]前边,即k+dk            }        }    }    for(int i=1; i<=n; i++)    {        if(i==1)            cout<<a[i];        else            cout<<' '<<a[i];    }    cout<<endl;}void Shell(int a[]){    int k;    for(int dk=n/2; dk>=1; dk/=2)    {        for(int i=1; i<=dk; i++)        {            for(int j=i+dk; j<=n; j+=dk)            {                if(a[j]<a[j-dk])                {                    a[0]=a[j];                    for(k=j-dk; judge(a[0],a[k])&&k>=1; k-=dk)                    {                        a[k+dk]=a[k];                    }                    a[k+dk]=a[0];                }            }        }    }    for(int i=1; i<=n; i++)    {        if(i==1)            cout<<a[i];        else            cout<<' '<<a[i];    }    cout<<endl;}int main(){    while(cin>>n)    {        for(int i=1; i<=n; i++)        {            cin>>a[i];            b[i]=a[i];        }        shell(n/2);        Shell(b);    }    return 0;}
正确:a[0]=a[j];for(k=j-dk; judge(a[0],a[k])&&k>=1; k=k-dk)                {                    a[k+dk]=a[k];                }                a[k+dk]=a[0];错误: a[0]=a[j];a[j]=a[j-dk];  for(k=j-2*dk; judge(a[0],a[k+dk])&&k>=1; k-=dk)     {         a[k+dk]=a[k];///此条件下,当a[j-2*dk]<a[j-dk],会使a[j-dk]=a[j-2*dk],但是实际情况应该是a[j-dk]=a[0]直接终止循环     }        a[k+dk]=a[0];


改进: for(int dk=n/2; dk>=1; dk/=2)    {        for(int j=dk+1; j<=n; j+=dk)        {            if(a[j]<a[j-dk])            {                a[0]=a[j];                for(k=j-dk; judge(a[0],a[k])&&k>=1; k-=dk)                {                    a[k+dk]=a[k];                }                a[k+dk]=a[0];            }        }    } for(int dk=n/2; dk>=1; dk/=2)    {        for(int i=dk+1; i<=n; i++)            for(int j=i-dk; j>=1&&a[j]>a[j+dk]; j=j-dk)                swap(a[j],a[j+dk]);    }



阅读全文
0 0