快速排序詳解C++
阿新 • • 發佈:2019-01-14
題目:將亂序陣列按從小到大排列。陣列中是允許出現重複數字的。
思路挺簡單:
(1) 在陣列中找個基準值(一般取開頭/中間/結尾的數值),以該基準值為界限,將小於基準值的數放在基準值左邊,大於基準值的值放在基準值右邊。
(2) 基準值左邊使用(1)中的方法,遞迴執行多次後,可以將左邊排好。
(3) 基準值右邊也一樣,使用(1)中的方法,遞迴執行多次後,可以將右邊排好。
程式碼:
#include <stdio.h> #include <iostream> /* 取陣列最後一位為基準,構建一個新陣列,新陣列左邊小於基準,新陣列右邊大於基準 */ int separater(int array[], int begin, int LastSubscript) //陣列、陣列起始地址、陣列最大下標 { int key = array[LastSubscript]; int leftpart = begin -1; for(int i = begin; i < LastSubscript; i++) { if(array[i] <= key) { leftpart++; std::swap(array[leftpart],array[i]); } } std::swap(array[leftpart+1], array[LastSubscript]); return (leftpart+1); } /* 即是上述“思路”的(2)、(3)步 */ void quicksort(int array[], int begin, int LastSubscript) { int position = 0; if(begin < LastSubscript) { position = separater(array, begin, LastSubscript); quicksort(array, begin,position - 1); //基準值左邊遞迴 quicksort(array, position + 1, LastSubscript); //基準值右邊遞迴 } } /* 結果符合從小到大排序要求 */ int main(int argc, char *argv[]) { int array[] = {8,5,6,3,1,9,4,4}; quicksort(array, 0, 7); for(int i = 0; i < 8; i++) { printf("array[%d] is %d:\n", i, array[i]); } }
快排演算法到此介紹結束。演算法學習並不是完全為了面試,對程式設計師的編碼能力提升也是很大的,近期將不斷學習和分享一些演算法部落格,現有需求的朋友歡迎檢視博主“演算法分類”中相關內容。