假設所有的排序都是從小到大排序
插入排序:預設陣列的前面m個數已經排好序了,將m+1個數插入進去,前面m+1個數是有序的,一直遍歷到最後乙個數。
時間複雜度:當陣列從小到大,o(n),從大到小o(n^2)
空間複雜度:在原陣列做交換,o(1)
穩定程度:插入是保證相等數值的前後相對位置的,穩定。
;}選擇排序:每次選擇最小的和已排序的部分後面的乙個數做交換。第一次從[0, n-1]找出最小,和第乙個數交換,第二次從[1, n-1]交換,和第二個數交換。
時間複雜度:o(n^2) (比較)
空間複雜度:o(1)
穩定性:不穩定,因為會不斷的交換位置,相同數值的前後相對位置可能被 打亂。
;}快速排序:每次選定第乙個數為基準值,最後乙個數為參照數,每次參照數的下標都向著基準值前進,並始終保持基準值小於參考值的時候,基準值在前面,大於參考值要在後面,如果不是的話就交換基準值和參考值的位置。
時間複雜度:o(nlogn) (比較)
空間複雜度:o(logn)~o(n) 原因:快排需要遞迴,所以棧空間會有消耗
穩定性:不穩定,快速排序基於交換排序,不保證相同值的相對位置
}/*從右向左找比key小的值*/
while
(arr[
--j]
> key)
//找到j的位置}if
(i >= j)
break
;/*交換i,j對應的值*/
int temp = arr[i]
; arr[i]
= arr[j]
; arr[j]
= temp;
}/*中樞值與j對應值交換*/
int temp = arr[low]
;//交換後完成一次快排,固定low的位置
arr[low]
= arr[j]
; arr[j]
= temp;
qsort
(arr, low, j -1)
;qsort
(arr, j +
1, high);}
qsort
(a,0
,sizeof
(a)/
sizeof
(a[0])
-1);
//呼叫
希爾排序:希爾排序的基礎是插入排序。首先設定每次的步長,可以由總數除2,之後每次迭代步長都除以2等等。當我們設定為d=5的時候,陣列中每隔4個分為一組,並將一組內的數排序。直到步長為0,可以認為陣列排好序了。當我們在一組內排序時,使用的是選擇排序,因為我們要利用之前的排序極大可能是有序的這個特點。選擇排序對於原本有序的陣列排序非常快。
時間複雜度:o(n^3/2)
空間複雜度:o(1)
穩定程度:因為數值相等的數字可能不分在同乙個陣列中,前後位置有變 化。
堆排序:堆排序是基於選擇排序的,選擇排序是遍歷一次,找到當前的最值。堆排序是將每次排序將最值放於樹的根節點。比如最小堆,我們將每次剩餘陣列的最小值放置於根節點。首先我們將數組建堆,為二叉樹。當我們開始一次排序時,自下而上地調整堆,如果父節點大於孩子節點,將孩子節點最小的節點與其進行交換。我們可以保證一次排序後,根節點是最小值,將根節點的值放入已排序的陣列中。同時將堆的最後乙個資料替換成根節點,因為這樣不影響樹的結構。
void
adjust
(vector<
int>
&arr,
int len,
int index)
}// 堆排序
void
heapsort
(vector<
int>
&arr,
int size)
// 調整大根堆
for(
int i = size -
1; i >=
1; i--)}
intmain()
;heapsort
(arr, arr.
size()
);for(
int i=
0;isize()
;i++
)return0;
}
歸併排序:歸併排序基於的是雙指標。首先將陣列不斷從中間等分,直到分成乙個元素。然後歸使用雙指標,開闢乙個雙倍歸併物件的空間,並填充到其中。所以需要乙個o(n)的輔助空間且為穩定排序。
歸併排序可以實現外部排序。由於歸併快有序,我們可以將比較的兩個歸併塊部分拿出去比較,並將結果寫到外存。
bfprt演算法
將n個元素每5個一組,分成n/5(上界)組。
取出每一組的中位數,任意排序方法,比如插入排序。
遞迴的呼叫selection演算法查詢上一步中所有中位數的中位數,設為x,偶數個中位數的情況下設定為選取中間小的乙個。
用x來分割陣列,設小於等於x的個數為k,大於x的個數即為n-k。
若i==k,返回x;若ik,在大於x的元素中遞迴查詢第i-k小的元素。
終止條件:n=1時,返回的即是i小元素。
簡單來說意思是,可以通過將陣列分成五份並在每份中排序,求出中位數的中位數,該數一定為整個陣列的中位數。和直接全排序的優點就是可以區域性排序,和希爾排序有些像。那麼我們確定好中位數後,根據其下標來找我們的topk,確定下一次使用該演算法是在中位數的中位數的左邊還是右邊。
排序 排序演算法整理
經常零零散散的用到排序演算法,將幾類常見的總結下來 時間複雜度o n 2 空間複雜度o 1 穩定排序 param arr public static void insersort int arr else arr j 1 tmp 氣泡排序 時間複雜度 o n 2 空間複雜度o 1 穩定排序 para...
排序演算法整理
template void cinsertsort mysort function compare template void cselectsort mysort function compare swap datas i datas id void cshellsort mysort funct...
排序演算法整理
先把常用排序演算法進行分類 插入排序 直接插入排序 折半插入排序 希爾排序 交換排序 氣泡排序 快速排序 選擇排序 簡單選擇排序 堆排序 歸併排序 基數排序 下面我們乙個乙個來看 1.直接插入排序 進行n 1趟排序,每趟把乙個元素插入到前面已經排好序的序列中,其時間複雜度為o n 並且由於判斷要插入...