總結:
1、 時間復雜度記憶-
冒泡、選擇、直接 排序需要兩個for循環,每次只關注一個元素,平均時間復雜度為O(n2)O(n2)(一遍找元素O(n)O(n),一遍找位置O(n)O(n))
快速、歸並、希爾、堆基於二分思想,log以2為底,平均時間復雜度為O(nlogn)O(nlogn)(一遍找元素O(n)O(n),一遍找位置O(logn)O(logn))
2、 穩定性記憶-“快希選堆”(快犧牲穩定性)
排序算法的穩定性:排序前后相同元素的相對位置不變,則稱排序算法是穩定的;否則排序算法是不穩定的。
一、選擇排序
思想:
每次從待排序的數據元素中選出最小的一個元素存放在序列的起始位置
即:在長度為N的無序數組中,第一次遍歷n-1個數,找到最小的數值與第一個元素交換;
第二次遍歷n-2個數,找到最小的數值與第二個元素交換;
。。。
第n-1次遍歷,找到最小的數值與第n-1個元素交換,排序完成。
具體過程:
Java代碼:
二、堆排序
思想:
主要解決兩個問題:1)如何將一個無序序列變成一個堆? 2)如何在輸出堆頂元素之后,調整剩余元素成為一個新的堆?
建堆得過程:將堆看成一個完全二叉樹,則二叉樹中所有非終端節點得值均不大於左右孩子節點得值。堆頂元素必定是最大值或者是最小值
輸出堆頂元素得過程:將堆頂和最后一個元素交換,然后重新建成一個小頂堆或者大頂堆
具體過程:
Java代碼:
三:插入排序
思想:在含有i-1個記錄得有序子序列r[1..i-1]中插入r[i]后,變成含有i個記錄得有序子序列。為了避免數組下標越界,在r[0]處設置監視哨
具體過程:
Java代碼:
四:希爾排序
思想:
在要排序的一組數中,根據某一增量分為若干子序列,並對子序列分別進行插入排序。
然后逐漸將增量減小,並重復上述過程。直至增量為1,此時數據序列基本有序,最后進行插入排序。
具體過程:(增量分別是4,2,1)
Java代碼:
五:交換排序--冒泡排序
思想:
兩個數比較大小,較大的數下沉,較小的數冒起來。
比較相鄰的兩個數據,如果第二個數小,就交換位置。
從后向前兩兩比較,一直到比較最前兩個數據。最終最小數被交換到起始的位置,這樣第一個最小數的位置就排好了。
繼續重復上述過程,依次將第2.3...n-1個最小數排好位置。
具體過程:
Java代碼:
六:交換排序--快速排序
思想:
1、先從數列中取出一個數作為key值;
2、將比這個數小的數全部放在它的左邊,大於或等於它的數全部放在它的右邊;
3、對左右兩個小數列重復第二步,直至各區間只有1個數。
具體過程:
Java代碼:
七:歸並排序
思想:
定義:是將兩個或多個有序表合成一個新的有序表
假設初始序列含有n個記錄,看成是n個有序的子序列,每個子序列的長度為1.
之后兩兩歸並,得到【n/2】個長度為2或者1的有序序列。
再兩兩歸並。。。。重復該過程,直到得到一個長度為n的有序序列
具體過程:
可以將A,B組各自再分成2組。
依次類推,當分出來的小組只有1個數據時,可以認為這個小組組內已經達到了有序,
然后再合並相鄰的2個小組就可以了。這樣通過先遞歸的分解數列,再合並數列就完成了歸並排序
Java代碼: