爲計算機專業大學生提供的c實現的快速排序算法

學習數據結構以及平時老師留的作業中有很多算法題,故分享給計算機專業在校朋友們代碼,希望能幫助你理解然後完成作業考試。

算法思想:    

給定一個數組,每次選取數組第一個位置作爲樞軸元素,然後通過low和high兩個變量,一個指向數組第一個位置,一個指向數組最後一個位置。

主要看我的代碼,劃分函數這個方法裏面,每次我把array[low]賦值給provt,也就是樞軸元素,然後在low小於high的情況下執行內部兩個while循環,因爲已經把low位置的值充當樞軸元素了,所以其實這個時候其實array[low]裏的值就相當於空了,因此我們的while循環是從後向前,先執行high--,(注意這個細節)找到比樞軸元素provit小的元素,就將其放到array[low]當中,這個時候array[high]的值也就相當於空了,然後執行第二個while循環,也就是比樞軸元素小的話就執行low++,找到比樞軸元素大的值就放到array[high]裏,最後low和high相等跳出循環,確定樞軸元素的最終位置,以此類推,應該就可以看懂這個代碼了,由於筆者水平有限,描述可能有不清晰的地方,大家可以評論留言互動。

#include <stdio.h> 
#define SiZE 9

//輸出函數 
void DisPlay(int array[],int maxsise){
    for(int i=0;i<maxsise;i++){
        printf("%d ",array[i]);
    }
    printf("\n");
    return; 
}

//劃分函數
int Partition(int array[],int low,int high){
    int prvot = array[low];
    while(low<high){
        //比樞軸元素大的話就不操作,high--, 
        while(low<high&&array[high]>=prvot)
            high--;
            array[low]=array[high];//比樞軸元素小的移動到左端
        //比樞軸元素小的話就不操作,low++, 
        while(low<high&&array[low]<=prvot)
            low++;
            array[high]=array[low];//比樞軸元素大的移動到右端 
    }
    array[low]=prvot;//樞軸元素的最終位置
    
    printf("這次充當樞軸元素的值和最終位置:%d %d\n",array[low],low+1);
    DisPlay(array,SiZE);
    return low; 

//快速排序
void QuickSort(int array[],int low,int high){
    if(low<high)
    {
        int pivotpos = Partition(array,low,high);//確定第一次劃分樞軸元素的最終位置 
        QuickSort(array,low,pivotpos-1);//劃分左子表 
        QuickSort(array,pivotpos+1,high);//劃分右子表 
    }
}

int main(){
    int array[SiZE] = {66,13,51,76,81,26,57,69,23};  
    printf("排序前:\n");
    DisPlay(array,SiZE);
    
    QuickSort(array,0,SiZE-1); 
    printf("排序後:\n");
    DisPlay(array,SiZE);
    
}

代碼實現結果:

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