C語言:快速排序

排序思想

1.快排是對冒泡排序的一種改進,在快速排序中,元素的比較和移動是從兩端向中間進行的,關鍵碼較大的元素一次就能從前面移動到後面,關鍵碼較小的元素一次就能從後面移動到前面,元素移動距離的較遠,從而減少了總的比較次數和移動次數

2.快速排序是基於分治法設計的,其分治策略是:
①、劃分:選定一個元素作爲軸值,以軸值爲基準將整個序列劃分爲兩個子序列。軸值的位置在劃分的過程中確定,並且前一個子序列的元素均小於或者等於軸值,後一個子序列的元素大於或者等於軸值

②、求解子問題:分別對劃分後的每一個子序列遞歸處理
③、合併:由於對子序列的排序是就地進行的,所以合併並不需要執行任何操作

排序方法

1.選擇軸值,一般是選取第一個元素的關鍵碼。有一個快排的最壞情況就是如果待排序元素是正序或者逆序,就會將除軸值以外的元素分到軸值的一邊。
2.劃分
①、設置劃分區間:i=first,j=end
②、執行右側掃描,直到r[j]小於軸值,將r[j]與r[i]交換,i++
③、執行左側掃描,直到r[i]大於軸值,將r[i]與r[j]交換,j–
④、重複二到三直到i=j,確定看軸值的所在位置,返回該位置

初始鍵值序列      23  12  35  6  19  50  28
一次劃分後       [19  13  6] 23 [35 50 28]
分別進行快速排序  [6  13] 19
                 6  [13]
                    13
                               [28] 35 [50]
                                28  35
                                        50
最終結果           6  13  19  23  28  35  50                                        

3.對待排序序列進行了一次劃分後,在分別對左右兩個子序列進行快速排序,以此類推。

算法實現

#include<stdio.h>
#include<stdlib.h>

/*
快速排序
*/


//打印的數組
void Print(int args[], int end){
    int i;

    for (i = 0; i <= end; i++){
        printf("%d,", args[i]);
    }
    printf("\n");
}

//快速排序一次劃分算法
int Partition(int args[], int first, int end){

    int i,j;
    int temp;
    i = first;
    j = end;

    while (i < j){
        //進行右側掃描
        while (i < j&&args[i] < args[j])j--;
        if (i < j){
            temp = args[i];
            args[i] = args[j];
            args[j] = temp;
            i++;
        }
        //進行左側掃描
        while (i < j&&args[i] <= args[j]) i++;
        if (i < j){
            temp = args[i];
            args[i] = args[j];
            args[j] = temp;
            j--;
        }
    }

    return i;
}

//快速排序算法,遞歸調用
void QuickSort(int args[], int first, int end){
    int pivot;
    if (first < end){
        pivot = Partition(args, first, end);
        printf("排序中:");
        Print(args, end);

        QuickSort(args, first, pivot - 1);
        QuickSort(args, pivot + 1, end);
    }
}


int main(void){
    int args[] = { 23, 13, 35, 6, 19, 50, 28 };
    int first = 0;
    int end = 6;
    //打印排序前的數組
    printf("原始數組:");
    Print(args, end);
    QuickSort(args, first, end);
    printf("排序完成後的數組:");
    Print(args, end);
    system("pause");
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章