藍橋杯之數列排序(快排及交換排序兩種方式c++實現)

資源限制

時間限制:1.0s 內存限制:512.0MBc++

問題描述

給定一個長度爲n的數列,將這個數列按從小到大的順序排列。1<=n<=200算法

輸入格式

第一行爲一個整數n。第二行包含n個整數,爲待排序的數,每一個整數的絕對值小於10000。ide

輸出格式

輸出一行,按從小到大的順序輸出排序後的數列。函數

樣例輸入

5
8 3 6 4 9ui

樣例輸出

3 4 6 8 9spa

快排排序方式代碼展現

#include<cstdio>
#include<stdlib.h>
using namespace std;

// 該算法查找序列中第一個值的最終位置,並對序列進行一次排序
int location(int *arys,int start,int end)
{
    int temp = arys[start];
    //如下while中的算法不明白能夠畫圖推算
    while(start<end)
    {
        if(arys[end]>temp)end--;//從尾部向前查找第一個比temp值小的值end
        arys[start]=arys[end];//將end值存入偏頭部start值
        if(arys[start]<temp)start++;//從頭部向後查找第一個比temp值大的值start
        arys[end]=arys[start];//將start值存入偏尾部end位置
    }
    arys[start]=temp;//將序列中的第一個值放到最終位置
    return start;
}
//遞歸進行快排排序
int quick_sort(int *arys,int start,int end)
{
    //快排未結束標誌
    if(start<end)
    {    
        int n = location(arys,start,end);//查找序列中第一個值的最終位置
        quick_sort(arys,start,n-1);//對序列從start位置到n-1位置進行快排
        quick_sort(arys,n+1,end);//對序列從n+1位置到end位置進行快排
    }
}

int main()
{
    int arys[200]={0},n;//定義並初始化序列arys,定義n值
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arys[i]);
    }
    quick_sort(arys,0,n-1);//對arys進行快排
    for(int i =0;i<n;i++)
    {
        printf("%d ",arys[i]);
    }
    system("pause");
    return 0;
}

快排排序方式算法之個人總結

  • 快排在遞歸方式下沒有「剪支」會加長運行時間,但大多數狀況下快排是個好選擇。
  • 對scanf函數的格式化輸出應注意對int,double,float,char,short的不一樣使用方式,詳細可查看sacnf格式化輸出

交換排序方式代碼展現

#include<cstdio>
#include<stdlib.h>
using namespace std;

int main()
{
    int arys[200]={0},n;//定義並初始化序列arys,定義n值
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",&arys[i]);
    }
    //進行交換排序
    int min=0,mid;//min爲序列中最小值得位置,mid爲交換的中間過渡值
    //從第i值開始,將從第i+1個值到n-1值中最小的值與第n個值交換,i從0到n-1.
    for(int i=0;i<n;i++)
    {
        min = i;
        //記錄i+1到n-1對應arys中最小值的位置
        for(int j=i+1;j<n;j++)
        {
            if(arys[j]<arys[min])
            {
                min = j;    
            }
        }
        if(min!=i)//這裏使用剪支法,若min值爲i值也就是沒有進行上面的記錄for循環
        {
            mid = arys[min];
            arys[min] = arys[i];
            arys[i] = mid; 
        }
    }
    //打印排序後的arys序列
    for(int i =0;i<n;i++)
    {
        printf("%d ",arys[i]);
    }
    system("pause");
    return 0;
}

交換排序算法之個人總結

  • 交換排序適用於排序序列的長度不是特別大的序列,一般是50,。
  • 對scanf函數的格式化輸出應注意對int,double,float,char,short的不一樣使用方式,詳細可查看sacnf格式化輸出
  • 交換排序過程當中記錄i+1到n-1對應arys中最小值的位置時要注意min值在不斷變化,不要使用i代替min記錄最小值的位置
相關文章
相關標籤/搜索