希尔排序(排序过程解析)

 

希尔排序

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

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

Input

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

 

Output

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

Sample Input

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

Sample Output

5 4 3 2 1 10 9 8 7 6
1 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

 

Source

xam

SDUTACM运维技术中心

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int data[123456];
int shell[123456];
void shellinsert(int dk,int n)
{   int i,j;
    for(i=dk+1;i<=n;i++)
        if(data[i]<data[i-dk])
    {
        data[0]=data[i];//设置哨兵
        for(j=i-dk;j>0&&data[0]<data[j];j-=dk)
            data[j+dk]=data[j];//find the location to insert
        data[j+dk]=data[0];     //INSERT THE DATA
    }
}
void shellsort(int n)
{   //set the shell dk
    shell[0]=n/2;
    int i,k;
    for(i=1;shell[i-1]!=1;i++)
        shell[i]=shell[i-1]/2;
    for(k=0;shell[k]>=1;k++)
    {
        shellinsert(shell[k],n);
        if(shell[k]==n/2||shell[k]==1)
        {
            for(i=1;i<n;i++)
                printf("%d ",data[i]);
            printf("%d\n",data[n]);
        }
    }

}
int main()
{   int i,n;
    while(scanf("%d",&n)!=EOF)
    {   memset(data,0,sizeof(data));
        memset(shell,0,sizeof(shell));
        for(i=1;i<=n;i++)/*留下data[0]作为哨兵*/
            scanf("%d",&data[i]);
        shellsort(n);

    }
    return 0;
}

 

希尔排序: 先进行宏观调整,后微观调整。

【 10  9  8  7  6  5  4  3  2  1 】

1.增量为 5 时:                                                                       分别进行插入排序的结果:

①【10  5 】                                                                                            【 5 10】 

②【 9   4 】                                                                                            【 4  9 】 

③【 8   3 】                                                                                            【 3  8 】 

④【 7   2 】                                                                                            【 2  7 】 

⑤【 6   1 】                                                                                            【 1  6 】 

 此时data [ ] 为:【 5 4 3 2 1 10 9 8 7 6 】

2.增量为 4 时:                                                                        分别进行插入排序的结果:

①【 5 1 7 】                                                                                           【 1   5  7 】

②【 4 10  6 】                                                                                        【 4   6  10 】

③【 3  9 】                                                                                             【 3   9 】

④【 2  8 】                                                                                             【 2   8 】

此时data [ ] 为:【 1 4 3 2 5 6 9 8 7 10 】

以此递推到增量为 1 。

(希望可以帮到你一点!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值