c 實現冒泡 快速 選擇和插入排序演算法

2021-09-22 07:08:47 字數 1588 閱讀 4989

整理一下常用的排序演算法,用c#實現,以備日後再用。code is cheap.看具體實現吧。

1.氣泡排序

將被排序的記錄陣列r[1..n]垂直排列,每個記錄r[i]看作是重量為r[i].key的氣泡。根據輕氣泡不能在重氣泡之下的原則,從下往上掃瞄陣列r:凡掃瞄到違反本原則的輕氣泡,就使其向上"飄浮"(冒泡因此得名)。如此反覆進行,直到最後任何兩個氣泡都是輕者在上,重者在下為止。

冒泡演算法小結:

因為每一趟排序都使有序區增加了乙個氣泡,在經過n-1趟排序之後,有序區中就有n-1個氣泡,而無序區中氣泡的重量總是大於等於有序區中氣泡的重量,所以整個氣泡排序過程至多需要進行n-1趟排序。若在某一趟排序中未發現氣泡位置的交換,則說明待排序的無序區中所有氣泡均滿足輕者在上,重者在下的原則,因此,氣泡排序過程可在此趟排序後終止。為此,在下面給出的演算法中,引入乙個布林量flag,在每趟排序開始前,先將其置為false,若排序過程中發生了交換,則將其置為true.各趟排序結束時檢查flag,若未曾發生過交換則終止演算法,不再進行下一趟排序。(不加flag也可以實現排序,但是會造成不必要的迴圈和比較)。

2.快速排序 ***

一、演算法思想

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

二、快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

(1)分解: 

在r[low..high]中任選乙個記錄作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

注意

:劃分的關鍵是要求出基準記錄所在的位置pivotpos。劃分的結果可以簡單地表示為(

注意 pivot=r[pivotpos] ):  r[low..pivotpos-1].keys≤r[pivotpos].key≤r[pivotpos+1..high].keys,

其中low≤pivotpos≤high。(邊界條件)

(2)求解: 

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

(3)組合: 

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

網上還有一種相似的**,一起貼出來:

3.選擇排序

4.插入排序

雖然在實際的專案中,我們的確很少用到這些或其他更高階的演算法,但是」演算法是程式的靈魂「。雖然演算法確實很難,但是」當你用它們巧妙地解決問題的時候,那種純粹的喜悅和快樂是任何不曾體驗過的人所能感受到的「。很不幸,我還沒有體驗幾次這樣的快樂。

氣泡排序,插入排序,選擇排序和快速排序 C語言

這篇博文主要用於自己學習的文章梳理,方便以後回憶。first,氣泡排序,演算法的時間複雜度是n n 在資料較多的時候,和快速排序比較執行時間,簡直慢的掉渣,氣泡排序的思想,主要是相鄰兩個元素比較,如果前乙個元素比後乙個元素大,則進行交換,否則繼續後移,知道一次迴圈結束,此時最後乙個元素是序列中最大的...

Java實現冒泡,快速,選擇,插入排序演算法

排序演算法 有很多,包括 插入排序 氣泡排序 堆排序 歸併排序 選擇排序,計數排序 基數排序 桶排序 快速排序 等。插入排序,堆排序,選擇排序,歸併排序和快速排序,氣泡排序都是比較排序,它們通過對 陣列中的元素進行比較來實現排序,其他排序演算法則是利用非比較的其他方法來獲得有關輸入陣列的排序資訊。一...

氣泡排序 選擇排序 插入排序 快速排序

include 氣泡排序,思想 從最末位開始 往前一位一位比較,比前一位小的話,就交換位置 兩個for,第乙個for迴圈用於記錄已排序的位置,第二個for迴圈用於已排序位置到結束位置之間的氣泡排序 void popsort int p int n 選擇排序,由前往後選擇最小的數。一輪比較完後,將最小...