算法

例如:待排序序列     5,4,3,7,2,7,(目的是升序排列)


 1.冒泡排序:


排n趟,每趟只是將原序列變得相對有序,隨着趟數的增加,有序性也得到提升,最終完全有序


 5,4,3,7,2,7


第一趟,5>4,交換---》   4,5,3,7,2,7


               5>3 ,交換---》 4,3,5,7,2,7


               5<=7,不交換


              7>2  ,交換,---》4,3,5,2,7,7


第一趟冒泡結果:4,3,5,2,7,7 , (其中  4,5,7,7有序)


第二趟冒泡結果(重複第一次的比較方式):3,4,2,5,7,7(其中3,4,5,7,7有序)


第三趟冒泡結果:3,2,4,5,7,7(其中3,4,5,7,7和2,4,  有序)


第四趟冒泡結果:2,3,4,5,7,7(其中2,3,4,5,7,7有序)


第五趟冒泡:沒有發生交換,冒泡到此結束


規律:每趟比較都是將大的元素交換到後面


   第一趟比較,就能將最大元素交換到最後


   第二趟比較,就能將第二大元素交換到倒數第二個位置



blob.png




2.選擇排序:


使用一個單位的空間來存放當前比較對象序列中的第一個元素,該趟的目標是找出這段比較序列中的最小元素及其下標,將其交換到這段比較序列頭部


第一趟:比較序列是  5,4,3,7,2,7


初始minPos=0;


   minVal=array[0]=5


在這一趟比較中,會出現  4<minVal=5   需要更新最小值:minVal=4,minPos=1


                                               3<minVal=4 需要更新最小值:minVal=3,minPos=2


                                                2<minVal=3 需要更新最小值:minVal=2,minPos=4


第一趟比較完之後,將第一趟找出的最小元素交換到序列頭部


也就是 第一趟比較之前:   5,4,3,7,2,7,


第一趟比較之後交換結果:2,4,3,7,5,7


第二趟比較序列是:2, 4,3,7,5,7


比較交換後結果: 2,3,4,7,5,7


第三趟比較序列是:2,3,4,7,5,7


第i趟比較序列是:


array[i-1],array[i],....,array[array.length-1]


每比較完一趟,下一趟比較的元素數量比上一趟少一個

blob.png





3,插入排序:

模擬摸牌的過程,手中的牌始終是有序的,需要申請空間array.length(這個也是不一定的,如果直接將原數組在邏輯上分爲有序與無序的兩部分,也就不需要分配array.length 的空間來單獨存儲有序序列)

空間複雜度:o(1)

時間複雜度:o(n^2)


blob.png

快速排序



(1) 從數列中挑出一個基準值。 
(2) 將所有比基準值小的擺放在基準前面,所有比基準值大的擺在基準的後面(相同的數可以到任一邊);在這個分區退出之後,該基準就處於最終它應該在的地方。 
(3) 遞歸地把”基準值前面的子數列”和”基準值後面的子數列”進行排序。

快速排序的時間複雜度在最壞情況下是O(N2),平均的時間複雜度是O(N*lgN)。

假設有如下數組,將兩個哨兵設在左右端,最左端的值爲基準 
1.右邊向左運動,直到找到一個比基準小的數 
2.左邊向右運動,直到找到一個比基準大的數 
這裏寫圖片描述
3.交換兩個數 
這裏寫圖片描述
這裏寫圖片描述
4.如果兩個哨兵不相遇,則繼續上述步驟 
這裏寫圖片描述
5.相遇之後和基準交換 
這裏寫圖片描述
這裏寫圖片描述
這裏寫圖片描述

這樣‘6’就永遠在它最終應該待的地方了,對6的前一半和後一半進行上述完整操作即可(遞歸)

blob.png

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章