可能是你最容易看明白的快速排序(C 實現)

2021-08-19 19:01:31 字數 1481 閱讀 7641

我認為現在csdn大多關於快速排序的程式都是在扯淡。

不是針對某一位,我是說,我看到csdn的c++快排程式都是扯淡。

他們根本沒有把重點放在快速排序本身,為什麼我這麼說?我們往下看。

快排的本質思想就是分而治之。

舉例說明,我們要對3 5 2 1 4進行排序。

首先我們選中乙個數字當做是pivot,就是支點啦,然後我們把所有比pivot小的都放在左邊,比他大的放在右邊。我們這裡把數字2當做pivot。

(1) 2 (3 5 4)

ok,就變成了這樣,下面我們要怎麼樣?我們只要對(1)這一部分和(3 5 4)這一部分再用相同的方法排序不就好了?

注意,原來(3 5 2 1 4)是五個數,現在變成了兩部分+支點,這就是分而治之的典型思想。

如果用python非常好寫,但是我們要用c++就會發生一些問題。不信的話,我們順著c++的思路向下想——

第一步,我們寫個函式叫quicksort,然後想一下,這個遞迴函式的基線條件是什麼?你考慮一下。我們是不是可以用雙指標,乙個指向排序的頭部,乙個指向排序的尾部,當頭部超過尾部的時候,說明待排序的陣列小於等於1了,此時肯定是有序的。廢話,[1]這不是有序的嗎?乙個數字當然有序啊。

第二步,我們找乙個pivot,這個簡單,雙指標/2,二分法的經典做法就行。

第三步,我們把所有比pivot小的都放在前面,大的都放在後面(注意,我在程式裡pivot指的是下標,我在文中直接指的是數字大小,在程式中應該是array[pivot])。就是這一步啊,現在大家的**都著重於寫這玩意兒,這才是你們看的其他人寫的快排的時候,理解最困難的地方!

第三步(新),那我就用最簡單的辦法,新建兩個陣列,less陣列放小的,great陣列放大的,乙個int叫tmp放pivot。

第四步,把less,tmp和great連線起來。這就是新的data,然後帶著新的data和雙指標去遞迴吧!

#include "iostream"

#include "vector"

#include "algorithm"

using namespace std;

//c++實現快速排序

void quicksort(vector&data, int left,int right)

for (int i = left; i < right; i++)

quicksort(data,left, pivot);

quicksort(data, pivot+1,right); }

int main()

; cout << "排序前:";

for each (auto var in data)

cout << endl;

quicksort(data, 0, data.size());

cout << "排序後:";

for each (auto var in data)

while (1);

return 0;

}

你可能是自由的

序 一直都愛吃甜,甜到微微的澀。一直都想寫作,寫到天昏地暗。一直追逐自由,飛到天涯海角。孤獨的牧羊人在廣廖的草原牧著他的羊兒們,一生孤獨的他在3歲那年,父母已離開人世,剩下相依為命的奶奶也在10歲時離他而去,留下的只有兩頭羊兒。那一年,他哭的是那麼傷心,周圍嬉皮笑臉的人帶著乙個悲傷的面具,假惺惺的來...

可能是最精闢的Python matplot筆記

繪製多圖 多資料圖 特殊影象 y軸刻度逆時針旋轉45 plt.xticks rotation 45 x軸刻度逆時針旋轉45 plt.xlabel confidence x軸圖例 plt.ylabel money y軸圖例 plt.title confidence money 標題 2x2 第乙個位置...

可能是最簡單的感知機演算法

最近學習統計機器學習,主要是參考李航的 統計學習 看完感知機後準備用python實現一下書上的例子。自己先在網上搜尋相關 可是看了半天,大家的實現都太複雜了,動輒上百行,而且將功能拆分成各個及其短小的函式,顯得十分不緊湊,而且不容易理解掌握,因此,想自己實現乙個更加簡單的版本,方便初學者理解和掌握,...