例如:待排序序列 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有序)
第五趟冒泡:沒有發生交換,冒泡到此結束
規律:每趟比較都是將大的元素交換到後面
第一趟比較,就能將最大元素交換到最後
第二趟比較,就能將第二大元素交換到倒數第二個位置
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]
每比較完一趟,下一趟比較的元素數量比上一趟少一個
3,插入排序:
模擬摸牌的過程,手中的牌始終是有序的,需要申請空間array.length(這個也是不一定的,如果直接將原數組在邏輯上分爲有序與無序的兩部分,也就不需要分配array.length 的空間來單獨存儲有序序列)
空間複雜度:o(1)
時間複雜度:o(n^2)
快速排序
(1) 從數列中挑出一個基準值。
(2) 將所有比基準值小的擺放在基準前面,所有比基準值大的擺在基準的後面(相同的數可以到任一邊);在這個分區退出之後,該基準就處於最終它應該在的地方。
(3) 遞歸地把”基準值前面的子數列”和”基準值後面的子數列”進行排序。
快速排序的時間複雜度在最壞情況下是O(N2),平均的時間複雜度是O(N*lgN)。
假設有如下數組,將兩個哨兵設在左右端,最左端的值爲基準
1.右邊向左運動,直到找到一個比基準小的數
2.左邊向右運動,直到找到一個比基準大的數
3.交換兩個數
4.如果兩個哨兵不相遇,則繼續上述步驟
5.相遇之後和基準交換
這樣‘6’就永遠在它最終應該待的地方了,對6的前一半和後一半進行上述完整操作即可(遞歸)