快速排序 快速排序與數學歸納法

2021-09-12 07:27:15 字數 1376 閱讀 1579

public delegate bool comparedelegate(hpoint2d point0, hpoint2d point1);

public void quiksort(listlstpoint, int indexs, int indexe, comparedelegate

compare)

public int partition(listlstpoint, int indexs, int indexe, comparedelegate

compare)

}var pttemp2 = lstpoint[i + 1];

lstpoint[i + 1] = lstpoint[indexe];

lstpoint[indexe] = pttemp2;

return i + 1;

}

(1)對於乙個序列,首先將各元素與最後乙個元素進行比較,並將較小的元素放到其左邊,較大元素放到其右邊;

(2)得到兩個子串行,對每個子串行按上述方法處理,遞迴處理;

(3)即得到原位置已排序號的序列。

關鍵位置在partition方法,該方法運用了歸納法,

1)初始條件:int i = indexs - 1;int j = indexs;

i及其前的所有元素都小於最後乙個元素ptbase;i與j之間([i,j))的所有元素都大於ptbase

2)若j若j>ptbase,不作處理;----情況2

然後j++進行下一次判斷。

注意i與j元素互換的一步是為了處理當出現情況2後再次出現情況1時,比ptbase小的元素應該+1(i++),為了保證處理後仍然滿足i及其前的所有元素都小於最後乙個元素ptbase;i與j之間([i,j))的所有元素都大於ptbase需將i位置元素(大於ptbase)與j位置元素(小於ptbase)互換。

3)經過第二步處理後,依然滿足i及其前的所有元素都小於最後乙個元素ptbase;i與j之間([i,j))的所有元素都大於ptbase這一條件;

4)迴圈第二步直到j==indexend-1;每次處理後都滿足上述紅色字型所註條件;

結束迴圈時,對於該序列,i及其前的所有元素都小於最後乙個元素ptbase;i與j之間([i,j))的所有元素都大於ptbase,此時只需要將i+1位置元素(大於ptbase)與ptbase位置互換後就滿足該序列ptbase(i+1位置)之前的所有元素小於等於ptbase,之後的所有元素大於ptbase,

這樣乙個序列已經劃分為兩個子串行,對每個子串行按上述遞迴得到在原位置排序好的序列。

如果將判斷依據作為引數傳入快排方法,就會靈活很多。

數學歸納法

歸納 是一種從經驗事實中找出普遍特徵的認知方法。根據這個觀察,我們是不是可以大膽假設,前 n 個格仔的麥粒總數就是 2 1 呢?如果這個假設成立,那麼填滿 64 格需要的麥粒總數,就是 1 2 2 2 2 2 2 1 18446744073709551615。數學歸納法的一般步驟是這樣的 證明基本情...

數學歸納法與程式設計

什麼是數學歸納法?數學歸納法用於證明在自然數上的一些斷言是否成立。怎麼證明斷言對所有自然數成立?第一步 證明n 1是成立的 第二步 證明n 1時,如果對於n 1成立,那麼對於n成立 第二步不是直接證明,而是先假設n 1成立,再利用這個結論證明n是成立的 例子 用數學歸納法證明 1 2 3 n n n...

快速排序 歸納

選取乙個初始值 將所有比該初始值大的數置於初始值的右邊,所有比該初始值小的數置於初始值的左邊 迴圈以上操作,直到完成排序為止。首先,第一輪迴圈時分為兩步。第一步 從最右邊向左依次遍歷,查詢比初始值小的數,找到之後,更改arr left 的值,同時 left 即把小的數扔到左邊去 第二步 從最左邊向右...