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


     

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

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    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

    提示:希尔排序是基于增量的排序,简单来说就是将第1个数与第1+增量个数进行排序,依次向下进行,一直到排完为止

    代码实现如下(g++):
    #include<bits/stdc++.h>
    
    using namespace std;
    
    int a[10010];
    int b[10010];
    int d;
    
    void Shellsort1(int a[],int n)//希尔排序
    {
        d=n/2;//增量为n/2
        int i,j,t;
        for(i=d;i<n;i++)
        {
            for(j=i-d;j>=0;j--)
            {
                if(a[j]>a[j+d])
                {
                    t=a[j];
                    a[j]=a[j+d];
                    a[j+d]=t;
                }
            }
        }
    }
    
    void Shellsort2(int a[],int n)
    {
        d=1;//增量为1
        int i,j,t;
        for(i=d;i<n;i++)
        {
            for(j=i-d;j>=0;j--)
            {
                if(a[j]>a[j+d])
                {
                    t=a[j];
                    a[j]=a[j+d];
                    a[j+d]=t;
                }
            }
        }
    }
    
    int main()
    {
        int n;
        int i;
        while(~scanf("%d",&n))
        {
            for(i=0;i<n;i++)
            {
                scanf("%d",&a[i]);
                b[i]=a[i];
            }
            Shellsort1(a,n);
            for(i=0;i<n;i++)
            {
                i<n-1? printf("%d ",a[i]):printf("%d\n",a[i]);
            }
            Shellsort2(b,n);
            for(i=0;i<n;i++)
            {
                i<n-1? printf("%d ",b[i]):printf("%d\n",b[i]);
            }
        }
        return 0;
    }
    
    
    /***************************************************
    Result: Accepted
    Take time: 0ms
    Take Memory: 208KB
    ****************************************************/
  • 相关阅读:
    网络攻击技术:SQL Injection(sql注入)
    人生若只如初见,何事秋风悲画扇
    TCPClient、TCPListener的用法
    C#中时间的Ticks属性
    string.Empty、" "、null 三者之间的区别
    telnet的使用解析
    public DataTable ExecuteQuery(string sql) 这段话具体意思
    C#中三层架构UI、BLL、DAL、Model详解(送给自学的初学者)
    数据库三层架构
    获取SQL Server数据库的表结构的做法
  • 原文地址:https://www.cnblogs.com/syycjh/p/9513672.html
Copyright © 2020-2023  润新知