直接插入排序
基本思想:
將一個記錄插入到已排序好的有序表中,從而得到一個新,記錄數增1的有序表。即:先將序列的第1個記錄看成是一個有序的子序列,然后從第2個記錄逐個進行插入,直至整個序列有序為止。
要點:設立哨兵,作為臨時存儲和判斷數組邊界之用。
前i個排好,每次向后擴展一個
選擇排序
在要排序的一組數中,選出最小(或者最大)的一個數與第1個位置的數交換;然后在剩下的數當中再找最?。ɑ蛘咦畲螅┑呐c第2個位置的數交換,依次類推,直到第n-1個元素(倒數第二個數)和第n個元素(最后一個數)比較為止。
堆排序
以最大堆為例
以數組建堆
父節點必定比他的子節點小
父節點下標為i,則子節點下標為2i+1和2i+2
step1:建堆,假設長度為length
從最后一個有孩子節點(length-1)/2的節點開始,往下做堆調整操作;之后再-1往前一個節點重復該操作
如上圖a,我們現在num[3]節點進行調整,即97,找出他的子節點較小的一個進行交換,49和97交換,繼續從往下調整,直到數組結束或者該節點小于他的子節點,
重復操作直到建堆完畢。
step2:排序
每次將堆底元素和堆頂元素進行對換,然后對新的對頂元素重新進行滲透堆調整,數組長度-1;重復操作,直到排序完畢,此時數組呈倒序排列
代碼:
冒泡排序
基本思想:
在要排序的一組數中,對當前還未排好序的范圍內的全部數,自上而下對相鄰的兩個數依次進行比較和調整,讓較大的數往下沉,較小的往上冒。即:每當兩相鄰的數比較后發現它們的排序與排序要求相反時,就將它們互換。
快速排序
用分治思想來解決問題
優化:可以對元素小于等8的可以采取選擇排序