1. 程式人生 > >排序概念與插入排序-7-1 排序 (25 分)

排序概念與插入排序-7-1 排序 (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 <bits/stdc++.h>
using namespace std;

int main()
{
    int a[100010];
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=1;i<n;i++){
        int j=i-1;
        while(j>=0&&a[i]<a[j]){
            j--;
        }
        int temp=a[i];
        for(int k=i-1;k>j;k--){
            a[k+1]=a[k];
        }
        a[j+1]=temp;
    }
    for(int i=0;i<n;i++){
        if(i!=0)cout<<" ";
        cout<<a[i];
    }
    cout<<endl;
}

之後感覺有點繁瑣,優化了一下。。。

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int a[100010];
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    for(int i=1;i<n;i++){
        int j=i;
        while(j>0&&a[j]<a[j-1]){
            int temp=a[j];
            a[j]=a[j-1];
            a[j-1]=temp;
            j--;
        }
    }
    for(int i=0;i<n;i++){
        if(i!=0)cout<<" ";
        cout<<a[i];
    }
    cout<<endl;
}