排序演算法整理

2021-10-19 22:02:07 字數 3592 閱讀 1590

假設所有的排序都是從小到大排序

插入排序:預設陣列的前面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 並且由於判斷要插入...