快速排序(正序+倒序)C語言版

正序

#include <stdio.h>

void sort(int *, int, int);
void sort(int arr[], int left, int right)
{
    // 如果數組(子數組)只有1個元素時直接返回
    if (left == right) {
        return;
    }

    // i爲左向右移動位置指針,j爲右向左移動位置指針
    int i, j, tmp;
    // 第1個元素作爲本輪排序的參考值
    i = left + 1;
    j = right;

    while (i < j) {
        // 必須j先查找,條件匹配即停止
        // while (i < j && arr[j] > arr[left]) {
        while (i < j && !(arr[j] <= arr[left])) {
            j--;
        }

        // i開始查找,條件匹配即停止
        // while (i < j && arr[i] <= arr[left]) {
        while (i < j && !(arr[i] > arr[left])) {
            i++;
        }

        // 交換i和j位置的數值,可能是兩個位置,也可能是同位置(雖然多餘,但不影響結果)
        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }

    // 執行到這裏本輪的i,j查找已經結束,且兩者位置重合,重合位置爲拆分數組的分隔點
    // 參考值>i位置交換(因本次爲正序)
    if (arr[left] > arr[i]) {
        tmp = arr[left];
        arr[left] = arr[i];
        arr[i] = tmp;
    }

    // 拆分爲2個數組遞歸,左子數組不包含拆分點,右數組在至少包含拆分點本身1個元素(在本輪子數組爲2個元素時的情況)
    sort(arr, left, i - 1);
    sort(arr, i, right);
}

int main(void)
{
    int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0};
    int length;
    length = sizeof(arr) / sizeof(int);
    sort(arr,  0, length - 1);
    printf("-------------------\n");
    for ( int i = 0; i < length; i++ ) {
        printf("%d, ", arr[i]);
    }
    printf("\n");
    return 0;
}

倒序

#include <stdio.h>

void sort(int *, int, int);
void sort(int arr[], int left, int right)
{
    if (left == right) {
        return;
    }

    int i, j, tmp;
    i = left + 1;
    j = right;

    while (i < j) {
        while (i < j && arr[j] < arr[left]) {
        //while (i < j && !(arr[j] >= arr[left])) {
            j--;
        }

        while (i < j && arr[i] >= arr[left]) {
        //while (i < j && !(arr[i] < arr[left])) {
            i++;
        }

        tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
    if (arr[left] < arr[i]) {
        tmp = arr[left];
        arr[left] = arr[i];
        arr[i] = tmp;
    }

    sort(arr, left, i - 1);
    sort(arr, i, right);
}

int main(void)
{
    int arr[] = {12, 3, 7, 25, 11, 5, 23, 5, 0};

    int length;
    length = sizeof(arr) / sizeof(int);
    sort(arr,  0, length - 1);
    printf("-------------------\n");
    for ( int i = 0; i < length; i++ ) {
        printf("%d, ", arr[i]);
    }
    printf("\n");

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