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 即把小的數扔到左邊去 第二步 從最左邊向右...