冒泡排序介紹 冒泡排序(Bubble Sort),又被稱為氣泡排序或泡沫排序。 它是一種較簡單的排序算法。它會遍歷若干次要排序的數(shù)列,每次遍歷時,它都會從前往后依次的比較相鄰兩個數(shù)的大小;如果前者比后者大,則交換它們的位置。這樣,一次遍歷之后,最大的元素就在數(shù)列的末尾! 采用相同的方法再次遍歷時,第二大的元素就被排列在最大元素之前。重復(fù)此操作,直到整個數(shù)列都有序為止! 冒泡排序圖文說明
運行:
快速排序介紹 快速排序(Quick Sort)使用分治法策略。 它的基本思想是:選擇一個基準數(shù),通過一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨立的兩部分;其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都要小。然后,再按此方法對這兩部分數(shù)據(jù)分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數(shù)據(jù)變成有序序列。 快速排序流程:
代碼實現(xiàn):
運行:
直接插入排序介紹 直接插入排序(Straight Insertion Sort)的基本思想是:把n個待排序的元素看成為一個有序表和一個無序表。開始時有序表中只包含1個元素,無序表中包含有n-1個元素,排序過程中每次從無序表中取出第一個元素,將它插入到有序表中的適當(dāng)位置,使之成為新的有序表,重復(fù)n-1次可完成排序過程。 直接插入排序圖文說明
代碼實現(xiàn):
運行和冒泡一樣。。。。。 希爾排序: 希爾(Shell)排序又稱為縮小增量排序,它是一種插入排序。它是直接插入排序算法的一種威力加強版。該方法因DL.Shell于1959年提出而得名。 希爾排序的基本思想是: 把記錄按步長 gap 分組,對每組記錄采用直接插入排序方法進行排序。 隨著步長逐漸減小,所分成的組包含的記錄越來越多,當(dāng)步長的值減小到 1 時,整個數(shù)據(jù)合成為一組,構(gòu)成一組有序記錄,則完成排序。 我們來通過演示圖,更深入的理解一下這個過程。 在上面這幅圖中: 初始時,有一個大小為 10 的無序序列。 在第一趟排序中,我們不妨設(shè) gap1 = N / 2 = 5,即相隔距離為 5 的元素組成一組,可以分為 5 組。接下來,按照直接插入排序的方法對每個組進行排序。 在第二趟排序中,我們把上次的 gap 縮小一半,即 gap2 = gap1 / 2 = 2 (取整數(shù))。這樣每相隔距離為 2 的元素組成一組,可以分為 2 組。按照直接插入排序的方法對每個組進行排序。 在第三趟排序中,再次把 gap 縮小一半,即gap3 = gap2 / 2 = 1。 這樣相隔距離為 1 的元素組成一組,即只有一組。按照直接插入排序的方法對每個組進行排序。此時,排序已經(jīng)結(jié)束。 需要注意一下的是,圖中有兩個相等數(shù)值的元素 5 和 5 。我們可以清楚的看到,在排序過程中,兩個元素位置交換了。 所以,希爾排序是不穩(wěn)定的算法。 代碼實現(xiàn):
運行參考冒泡、、、、、 拓撲排序介紹 拓撲排序(Topological Order)是指,將一個有向無環(huán)圖(Directed Acyclic Graph簡稱DAG)進行排序進而得到一個有序的線性序列。 這樣說,可能理解起來比較抽象。下面通過簡單的例子進行說明! 例如,一個項目包括A、B、C、D四個子部分來完成,并且A依賴于B和D,C依賴于D。現(xiàn)在要制定一個計劃,寫出A、B、C、D的執(zhí)行順序。這時,就可以利用到拓撲排序,它就是用來確定事物發(fā)生的順序的。 在拓撲排序中,如果存在一條從頂點A到頂點B的路徑,那么在排序結(jié)果中B出現(xiàn)在A的后面。 拓撲排序的算法圖解 拓撲排序算法的基本步驟: 1. 構(gòu)造一個隊列Q(queue) 和 拓撲排序的結(jié)果隊列T(topological); 2. 把所有沒有依賴頂點的節(jié)點放入Q; 3. 當(dāng)Q還有頂點的時候,執(zhí)行下面步驟: 3.1 從Q中取出一個頂點n(將n從Q中刪掉),并放入T(將n加入到結(jié)果集中); 3.2 對n每一個鄰接點m(n是起點,m是終點); 3.2.1 去掉邊<n,m>; 3.2.2 如果m沒有依賴頂點,則把m放入Q; 注:頂點A沒有依賴頂點,是指不存在以A為終點的邊。 以上圖為例,來對拓撲排序進行演示。 第1步:將B和C加入到排序結(jié)果中。 頂點B和頂點C都是沒有依賴頂點,因此將C和C加入到結(jié)果集T中。假設(shè)ABCDEFG按順序存儲,因此先訪問B,再訪問C。訪問B之后,去掉邊<B,A>和<B,D>,并將A和D加入到隊列Q中。同樣的,去掉邊<C,F>和<C,G>,并將F和G加入到Q中。
第2步:將A,D依次加入到排序結(jié)果中。 第1步訪問之后,A,D都是沒有依賴頂點的,根據(jù)存儲順序,先訪問A,然后訪問D。訪問之后,刪除頂點A和頂點D的出邊。 第3步:將E,F,G依次加入到排序結(jié)果中。 因此訪問順序是:B -> C -> A -> D -> E -> F -> G 拓撲排序的代碼說明 拓撲排序是對有向無向圖的排序。下面以鄰接表實現(xiàn)的有向圖來對拓撲排序進行說明。 1. 基本定義
2. 拓撲排序
說明:
歸并排序基本思想 歸并排序(MERGE-SORT)是利用歸并的思想實現(xiàn)的排序方法,該算法采用經(jīng)典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然后遞歸求解,而治(conquer)的階段則將分的階段得到的各答案'修補'在一起,即分而治之)。 分而治之 可以看到這種結(jié)構(gòu)很像一棵完全二叉樹,本文的歸并排序我們采用遞歸去實現(xiàn)(也可采用迭代的方式去實現(xiàn))。分階段可以理解為就是遞歸拆分子序列的過程,遞歸深度為log2n。 合并相鄰有序子序列 再來看看治階段,我們需要將兩個已經(jīng)有序的子序列合并成一個有序序列,比如上圖中的最后一次合并,要將[4,5,7,8]和[1,2,3,6]兩個已經(jīng)有序的子序列,合并為最終序列[1,2,3,4,5,6,7,8],來看下實現(xiàn)步驟。 代碼實現(xiàn)
最后 歸并排序是穩(wěn)定排序,它也是一種十分高效的排序,能利用完全二叉樹特性的排序一般性能都不會太差。java中Arrays.sort()采用了一種名為TimSort的排序算法,就是歸并排序的優(yōu)化版本。從上文的圖中可看出,每次合并操作的平均時間復(fù)雜度為O(n),而完全二叉樹的深度為|log2n|。總的平均時間復(fù)雜度為O(nlogn)。而且,歸并排序的最好,最壞,平均時間復(fù)雜度均為O(nlogn)。 |
|