遞迴-*快速排序

HowieLee59發表於2019-03-30

Problem Description

給定N(N≤10^5)個整數,要求用快速排序對資料進行升序排列,注意不得使用STL。

 

Input

 連續輸入多組資料,每組輸入資料第一行給出正整數N(≤10^5),隨後給出N個整數,數字間以空格分隔。

Output

 輸出排序後的結果,數字間以一個空格間隔,行末不得有多餘空格。

Sample Input

8
49 38 65 97 76 13 27 49

Sample Output

13 27 38 49 49 65 76 97
#include<stdio.h>
int i,n,a[100010];

void qsort(int a[],int left,int right){
    int x = a[left],i = left,j = right;//以第一個數為一趟快排的樞軸元素
    if(i >= j){//遞迴終止
        return;
    }
    while(i < j){
        while(i < j && a[j] >= x){
            j--;
        }
        a[i] = a[j];
        while(i < j && a[i] <= x){
            i++;
        }
        a[j] = a[i];
    }
    a[i] = x;
    qsort(a,left,i-1);//左半區間遞迴呼叫
    qsort(a,i+1,right);//右半區間遞迴呼叫
}

int main(){
    while(~scanf("%d",&n)){
        for(int i = 0 ; i < n ;i++){
            scanf("%d",&a[i]);
        }
        qsort(a,0,n-1);
        for(i = 0 ; i < n - 1; i++){
            printf("%d ",a[i]);
        }
        printf("%d\n",a[n - 1]);
    }
    return 0;

}

 

相關文章