1. 程式人生 > >7-12 排序 (25 分)(希爾排序模板,內贈插入排序模板)

7-12 排序 (25 分)(希爾排序模板,內贈插入排序模板)

給定N個(長整型範圍內的)整數,要求輸出從小到大排序後的結果。

本題旨在測試各種不同的排序演算法在各種資料情況下的表現。各組測試資料特點如下:

 

  • 資料1:只有1個元素;

     

     

  • 資料2:11個不相同的整數,測試基本正確性;

     

     

  • 資料3:103個隨機整數;

     

     

  • 資料4:104個隨機整數;

     

     

  • 資料5:105個隨機整數;

     

     

  • 資料6:105個順序整數;

     

     

  • 資料7:105個逆序整數;

     

     

  • 資料8:105個基本有序的整數;

     

     

  • 資料9:105個隨機正整數,每個數字不超過1000。

     

    輸入格式:

    輸入第一行給出正整數N(≤10​5​​),隨後一行給出N個(長整型範圍內的)整數,其間以空格分隔。

    輸出格式:

    在一行中輸出從小到大排序後的結果,數字間以1個空格分隔,行末不得有多餘空格。

    輸入樣例:

  • 11

    4 981 10 -17 0 -20 29 50 8 43 -5

  • 輸出樣例:

  • -20 -17 -5 0 4 8 10 29 43 50 981

  • #include <iostream>
    #include <algorithm>
    #include <cstdio>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <cmath>
    using namespace std;
    int main()
    {
        int n,i;
        cin>>n;
        vector<int> a;
        for(int i=0;i<n;i++){
            int num;
            cin>>num;
            a.push_back(num);
        }
        for(int d=n/2;d>0;d/=2){//shell排序增量
            for(int p=d;p<n;p++){//插入排序的模板
                int tmp=a[p];
                for(i=p;i>=d&&a[i-d]>tmp;i-=d)
                    a[i]=a[i-d];
                a[i]=tmp;
            }
        }
        for(int j=0;j<n;j++){
            if(!j) cout<<a[j];
            else cout<<" "<<a[j];
        }
        return 0;
    }