快速排序用C語言可以這麼寫

西城風雨樓發表於2020-12-07

快速排序用C語言可以這麼寫

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

/**
 * 將nums中的資料,進行快速排序
 * @param nums 待排序的陣列
 * @param start 陣列中待排序序列的起始位置
 * @param end 陣列中待排序序列的終止位置
 */
void fastSort(int *nums, int start, int end) {
    if (start >= end)
        return; // 如果只有一個資料元素,那麼就不需要進行排序了
    // 記錄當前nums待排序序列的第一個資料元素,每次以第一個資料元素作為快速排序的樞紐元素
    // 所謂樞紐元素,就是讓該元素成為,其左邊都比它小,右邊都比它大
    int tmp = nums[start];
    int s = start;
    int e = end;
    // 當s==e時就是tmp要放入的位置
    while (s < e) {
        // 從右邊開始遍歷,一旦發現右邊某一個元素比tmp小,就需要將它調到左邊
        while (s < e && nums[e] >= tmp)
            e--;
        // 將右邊元素調到左邊
        if (s < e)
            nums[s++] = nums[e];
        // 接著看左邊,一旦發現左邊一個元素比tmp大,那麼需要將其調到右邊
        while (s < e && nums[s] <= tmp)
            s++;
        // 將元素調到右邊
        if (s < e)
            nums[e--] = nums[s];
    }
    // 將樞紐元素歸位
    nums[e] = tmp;
    // 遞迴處理左邊
    fastSort(nums, start, e);
    // 遞迴處理右邊
    fastSort(nums, s + 1, end);
}

int main(void) {
    int nums[100];
    for (int i = 0; i < 10; i++) {
        scanf("%d", nums + i);
    }
    fastSort(nums, 3, 8);
    for (int i = 0; i < 10; i++) {
        printf("%d\t", nums[i]);
    }
    printf("\n");
    return 0;
}

相關文章