快速排序

思想:
選一個基準(zhǔn)值, 將大于它的放右邊, 小于它的放左邊。找到該基準(zhǔn)值的下標(biāo), 然后繼續(xù)遞歸調(diào)用。

代碼實(shí)現(xiàn)

// 快速排序
void quickSort(int a[], int n) {
    if (n <= 1) {
        return;
    }
    quickSort_c(a, 0, n - 1);
    
    for (int i = 0; i < n; i++) {
        NSLog(@"%d", a[i]);
    }
}

// 遞歸函數(shù)
void quickSort_c(int a[], int left, int right) {
    // 遞歸終止條件
    if (left >= right) {
        return;
    }
    // 找到分區(qū)下標(biāo)
    int q = partionSection1(a, left, right);
    // 遞歸調(diào)用
    quickSort_c(a, left, q - 1);
    quickSort_c(a, q + 1, right);
}

找到基準(zhǔn)值的下標(biāo)
分區(qū)實(shí)現(xiàn)一

int partionSection1(int a[], int left, int right) {
    int i, j, pivot;
    i = left;
    // 取一個標(biāo)注數(shù), 將小于它的放左邊, 大于它的放右邊
    pivot = a[right];
    // 利用選擇排序思想
    for (j = left; j <= right - 1; j++) {
        if (a[j] < pivot) {
            int temp = a[j];
            a[j] = a[i];
            a[i] = temp;
            i = i + 1;
        }
    }
    int tempR = a[i];
    a[i] = a[right];
    a[right] = tempR;
    return i;
}

分區(qū)實(shí)現(xiàn)二

int partionSection2(int a[], int left, int right) {
    int i = left;
    int j = right;
    int key = a[left]; // 基準(zhǔn)值
    while (i < j) {
        while (i < j && a[j] >= key) {
            j--;  // 左移
        }
        a[i] = a[j];
        while (i < j && a[i] <= key) {
            i++;  // 右移
        }
        a[j] = a[i];
    }
    a[i] = key;
    return i;
}

使用

int a[] = {4, 13, 2, 1, 7, 9, 10, 8, 3, 6};
    int num = sizeof(a) / sizeof(int);
    quickSort(a, num);

??細(xì)品分區(qū)一和分區(qū)二的實(shí)現(xiàn)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容