探索初級演算法學習筆記 快速排序法

2021-10-01 17:29:20 字數 2187 閱讀 1392

#includevoid swap(int *a,int *b)

void quicksort(int *nums,int begin,int end)

swap(&nums[begin],&nums[i]);

quicksort(nums,begin,i-1);

quicksort(nums,i+1,end);

}int main();

quicksort(nums,0,9);

int i;

for(i=0;i<10;i++)

printf("\n");

return 0;

}

快速排序法是氣泡排序法的公升級版本。

氣泡排序法是從陣列的一段開始遍歷,比較相鄰兩個數的大小。

而快速排序法是,選擇任意乙個數為參照,這裡記為tmp,從陣列的兩端開始比較,兩邊同時開始遍歷,通過將比tmp大的數放到右邊,將比tmp小的數放到左邊,結合遞迴的思想 ,不斷引用自身函式實現全體陣列的排序。

寫**時需要注意:

while(i!=j)

假設參考值選擇為陣列的第乙個數,即nums[0]

(哈哈一般都是這麼選的)

引數i從左邊開始遍歷,找到比參考值大的數停下

引數j從右邊開始遍歷,找到比參考值小的數停下

這時,只需要將左右哨兵所在的位置的物件(陣列值num[i],num[j])進行交換,就能滿足,左邊的數不大於參考數tmp,右邊的數不小於參考數tmp

(一般都是這樣ha,也可以相反)

接著繼續巡邏,直到兩個哨兵相遇,該位置記為locate1,就把整個國界走過一遍(陣列遍歷,與參考值tmp比較了一遍),結果是左邊的所有數都不大於參考值tmp,右邊的所有數都不小於參考值tmp,*除了陣列的第乙個數nums[0],因為他被選做參考數tmp

while(i!=j)

這裡討論一下選做參考數的陣列的第乙個數nums[0]應該怎麼處理

首先,處理目標:讓nums[0]的數值tmp,調換到中間,使滿足左邊的數都不大於tmp,右邊的數都不小於tmp

其次,處理物件:第乙個數nums[0],哨兵相遇的位置上的數nums[locate1]

對於nums[locate1],c語言是面向過程的程式語言,**是依次執行,必然存在左哨兵先巡邏至停下,或者右哨兵先巡邏至停下的情況,而這兩種情況對應的nums[locate1]與tmp的大小關係也不相同

第一種情況 左邊哨兵先巡邏,先停下

還記得左邊哨兵的終止條件麼?

因為物件表示的數大於參考值時,左哨兵停下,

所以左哨兵先巡邏先停下的結果是,左右哨兵最後相遇時,

物件nums[locate1]是比參考值大的數

這時如果將 該物件的位置上的值nums[locate1]與參考值nums[0](陣列第乙個數的值)進行交換,結果是,該物件的位置,locate1右邊的數都不小於參考數(滿足要求了),該位置locate1上的數nums[locate1]等於參考數(也滿足要求了),

然而locate1左邊,第乙個數nums[0]大於參考數tmp

如果想實現 讓參考數左邊的數都不大於他,參考數的右邊的數都不小於他,必須進一步處理,將第乙個數換成不大於參考數的數

第二種情況,右邊哨兵先巡邏,先停下

同理,這種情況,兩哨兵最終相遇時,nums[locate1]<=tmp

這時只需要將 nums[0] (之前設為參考值tmp)與nums[locate1]交換即可滿足,將參考值tmp調換到了中間位置,而且參考值tmp左邊都不大於參考值tmp,右邊都不小於參考值tmp

顯然這種思路要簡便許多

而本文最初的**就採用了這種思路

while(i!=j)

---

這是我在學習快速排序法中的一些心得體會,

總結了在學習中遇到的讓左哨兵先巡邏還是右哨兵先巡邏的問題,另外我在敲**時還犯了將哨兵巡邏 while語句中的臨界條件nums[j]<=tmp錯寫成《的錯誤

總結經驗,繼續努力嘍~

演算法學習筆記(二) 初級排序演算法

時間複雜度 time complexity 總運算次數表示式中受n的變化影響最大的那一項 不含係數 注 若演算法中語句執行次數為乙個常數,則時間複雜度為o 1 若t n f n 求極限可得到一常數c,則時間複雜度t n o f n 隨著模組n的增大,演算法執行的時間的增長率和f n 的增長率成正比,...

演算法學習筆記 快速排序

在學習左神的演算法課,對快速排序有了更多的理解,在此記錄,以備後查 描述 快排1.0是基於單個支點進行遞迴操作。大體來講,是選擇陣列arr中的某乙個數作為支點pivot,經過一通操作 一般叫partition 使得左邊的數均小於等於pivot,右邊的數均 pivot,如此一來,pivot就待在了自已...

演算法學習筆記 1 快速排序

快速排序是一種二分的排序演算法,這種演算法的誕生來自於對有序陣列的觀察。我們假設有以下陣列 1,2,3,4,5,6,7,8,9 這是乙個已經按照從小到大排序完畢的有序陣列。觀察以上陣列,取其中間數5,我們可以發現5以左的數1,2,3,4均比5小,5以右的數6,7,8,9均比5大。我們以5為分界線將陣...