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

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

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

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

1.基本思想:算法现将要排序的一组数按某个增量d(n/2,n为要排序数的个数) 分成若干组,每组中记录的下标相差d。对每组中全部元素进行直接插入排序,然后再用一个较小的增量(d/2)对它进行分组,在每组中在进行直接插入排序。当增量减到1时,进行直接插入排序,排序完成。 
2.实例: 
这里写图片描述

3.代码实现:

#include <iostream>
#include<algorithm>
#include<stdio.h>
using namespace std;
int n;
int b[50000],a[50000];
void shell(int a[],int dk)
{
    for(int i=dk; i<n; i++)
    {
        for(int j=i-dk; j>=0; j-=dk)
        {
            if(a[j]>a[j+dk])
            {
                a[j]^=a[j+dk]^=a[j]^=a[j+dk];
            }
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        shell(a,n/2);
        for(int i=0; i<n; i++)
        {
            if(i==0)printf("%d",a[i]);
            else printf(" %d",a[i]);
        }
        printf("\n");
        shell(b,1);
        for(int i=0; i<n; i++)
        {
            if(i==0)printf("%d",b[i]);
            else printf(" %d",b[i]);
        }
        printf("\n");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41374539/article/details/81583546
今日推荐