八大排序-快速排序

基本思想

1)選擇一個基準元素,通常選擇第一個元素或者最後一個元素,

2)通過一趟排序講待排序的記錄分割成獨立的兩部分,其中一部分記錄的元素值均比基準元素值小。另一部分記錄的 元素值比基準值大。

3)此時基準元素在其排好序後的正確位置

4)然後分別對這兩部分記錄用同樣的方法繼續進行排序,直到整個序列有序。

(a)一趟排序的過程
這裏寫圖片描述
(b)排序的全過程
這裏寫圖片描述

算法實現

#include<stdio.h>
typedef int ElemType[10];

//交換數據
void swap(ElemType r,int i,int j){
    int temp;
    temp = r[i];
    r[i] = r[j];
    r[j] = temp; 
} 
//獲取中間元素位置 
int partition(ElemType r,int low,int high){
    int privoKey = r[low]; //基準元素(值) 
    while(low < high){ //從表的兩端交替地向中間掃描  
        while(low<high && r[high]>=privoKey){ //從high 所指位置向前搜索,至多到low+1 位置。將比基準元素小的交換到低端 
            high--;
        }
        swap(r,low,high);
        while(low<high && r[low]<=privoKey){//從low 所指位置向後搜索,至多到low-1 位置。將比基準元素小的交換到低端 
            low++;
        } 
        swap(r,low,high);
    } 
     return low;//low和high指向同一位置,即中間位置。 
}
void QSort(ElemType r,int low,int high){
    if(low<high){
        int privotLoc = partition(r,low,high);//將表一分爲二  
        QSort(r,low,privotLoc-1);//遞歸對低子表遞歸排序  
        QSort(r,privotLoc+1,high); //遞歸對高子表遞歸排序  
    }
}
//打印 
void print(ElemType r,int n){
    int i;
    for(i=0;i<n;i++){
        printf("%3d",r[i]);
    }
    printf("\n");
}

int main(){
    ElemType r = {3,1,5,7,2,4,9,6,10,8}; 
    printf("排序前:\n");
    print(r,10); 
    printf("快速排序後:\n");
    QSort(r,0,9);
    print(r,10);

    return 0;
}  

執行結果

這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章