快速排序(QuickSort) 算法思路詳解

最近在學算法,學到快速排序心得就和你們分享一下。如下代碼爲c作演示,看不懂代碼沒關係,作參考就行了,主要爲了明白快速排序思路。但願能幫助到你們。

快速排序分爲4個步驟算法

  1. 找一個基準數(參照數)
  2. 從右往左找比基準數小的數與左座標交換
  3. 從左往右找比基準數大的數與右座標交換
  4. 左、右座標相遇時,基準數與相遇座標交換
文字描述已講述完,接下來草稿演示,也能夠直接向下翻看代碼,可能代碼更有說服力

國足有6名隊員從左到右身高排序球號爲: 5號 9號 12號 3號 7號 8號ui

教練規定左邊第一個最高的爲隊長(基準數):5號
教練要拆分兩個隊:指針

右邊的球號要小於隊長球號而且左邊球號不能大於右邊 找到後和左邊交換位置code

  • 找到了3號比5號小,與左隊當前座標交換位置
    新順序爲:3號 9號 12號 5號 7號 8號
    座標定在第4我的

左邊的球號要大於隊長球號而且左邊球號不能大於右邊排序

  • 找到了9號比5號大,與右隊當前座標交換位置
    新順序爲:3號 5號 12號 9號 7號 8號
    座標定在第2我的

而後右邊繼續走找比5小的,最後走到了左隊座標位置,兩個相遇相等的座標讓隊長(基準數)放到相遇的位置。排隊完成。最終獲得的順序爲:遞歸

  • 3號 5號 12號 9號 7號 8號

左隊都是比隊長(5號)球號小的,右邊都是比隊長大的get

接下來就要從隊長開始繼續拆分左、右邊和上面教練說的同樣直到不能拆分爲止io

整個思路基本就這樣,接下來代碼實現:技術

#include <stdio.h>
#include <stdlib.h>
int a[101],n;
/**
* 快速排序:
*          1.以左邊第一位做爲基準數,
*           2.先右邊找一個比基準數小的數與左指針所在的位置進行交換    
*           3.從左邊找一個比基準數大的數與右指針所在的位置進行交換
*          4.相遇後則把基準數和左、右指針重合的位置進行交換
*           5.重複1/2/3/4操做
* 注意:
*        若是左座標大於右座標位置則沒法計算,必須左座標小於右座標。
*/
void quicksort(int left, int right){
    int i,j,base;
    i = left;
    j = right;
  
    if (left>right) return ;
    // 1.第一步,定義基準數
    base = a[left]; 
  
    // 4.左座標不等於右座標時繼續迭代,等於則相遇
    while(left != right){
     
    
        // 2.若是右邊大於基準數則繼續遞減迭代至小於基準數中止
        while(left<right && a[right]>=base)
            right--;
        // 2.1 與左指針所在位置進行交換
        a[left] = a[right];
     
        // 3.若是左邊小於基準數則繼續遞增迭代至大於基準數中止
        while(left<right && a[left]<=base)
            left++;
        // 3.1 與右指針所在位置進行交換
        a[right] = a[left];
        
        
    }
    // 4.1 左右座標相遇替換基準數
    a[left] = base;
     
    // 5.重複1.2.3.4 遞歸
    quicksort(i, left-1); // 重複基準數左邊
    quicksort(left+1, j);
    return;
}
int main()
{
    int i,j;
    printf("=============快速排序==============\r\n");
    printf("請輸入數量:");
    scanf("%d", &n);
    for (i=1; i<=n; i++){
        scanf("%d", &a[i]);
    }
    
    quicksort(1, n);
    printf("快速排序結果:\r\n");
    
    for (i=1; i<=n; i++)
        printf("%d ", a[i]);
   
    getchar(); getchar();
    system("pause");
    return 0;
}

本文作爲技術參考,也歡迎大神們指導和批評,但願對你們有幫助。sort

相關文章
相關標籤/搜索