重拾算法Day03-快速排序

快速排序基本思想

以 6 1 2 7 9 3 4 5 10 8 按從小到大排序 為例進行說明:

  1. 以6為基準,小于6的放在6的左邊,大于6的放在6的右邊。
  2. 設置兩個標志器i=0, j=9; i在數組的最左邊,j在數組的最右邊。
  3. j先動,依次比較a[j]<6,如果不成立,j--; 如果成立則j停止。如果j<i,停止。
  4. i再動,依次比較a[i]>6, 如果不成立,i++;如果成立i停止。如果j<i,停止。
  5. 如果i=j,就將6與a[j]進行交換。
    如此進行一輪:等到的結果是
    3 1 2 5 4 6 9 7 10 8
    6 左邊的都小于6,6右邊的都大于6。
    然后再排序 3 1 2 5 4
    然后再排序 9 7 10 8

代碼實現

#include <stdio.h>
int a[100];
int n;

void quicksort(int left, int right)
{
    if (left >= right) {
        return;
    }
    int i, j;
    i=left;
    j=right;
    int temp = a[left]; //基準數據
    while (i!=j) {
        while (a[j]>=temp && j>i) {
            j--;
        }
        while (a[i]<=temp && j>i) {
            i++;
        }
        
        if (i<j) {
            int k = a[i];
            a[i] = a[j];
            a[j] = k;
        }
        
    }
    
    a[left] = a[i];
    a[i] = temp;
    
    quicksort(left, i-1);
    quicksort(i+1, right);
    
    return;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    
    scanf("%d", &n);
    for (int i=0; i<n; i++) {
        scanf("%d", &a[i]);
    }
    
    quicksort(0, n-1);
    for (int i=0; i<n; i++) {
        printf("%d ", a[i]);
    }
    printf("\n");
    
    return 0;
}

總結

快速排序之所以比較快,因為相比冒泡排序,每次交換都是跳躍式的。每次排序都設置一個基準點,將小于等于基準點的數全部放在基準點的左邊,將大于等于基準點的數全部放在基準點的右邊。這樣在每次交換的時候就不會像冒泡排序一樣只能在相鄰的數之間進行交換。交換的距離也大得多了。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 概述 排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    蟻前閱讀 5,223評論 0 52
  • 概述:排序有內部排序和外部排序,內部排序是數據記錄在內存中進行排序,而外部排序是因排序的數據很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,747評論 0 15
  • quicksort可以說是應用最廣泛的排序算法之一,它的基本思想是分治法,選擇一個pivot(中軸點),將小于pi...
    黎景陽閱讀 471評論 0 1
  • 半夜睡不著,早上又早早的自然醒。像個有心事的失眠人,卻滿腦子放空。 坐著發呆,想到一個詞:虛度光陰。回來后整日的無...
    禾必閱讀 133評論 0 0
  • 一 弟弟的房子交房了,他興奮地準備裝修,目標明確:要裝成樣板房那樣。當初看到樣板房,他眼前一亮,這是他夢想中的家。...
    王月冰閱讀 578評論 0 3