八大排序演算法複雜度及C 實現

2021-10-06 09:50:47 字數 3606 閱讀 6166

選擇排序(從小到大)

插入排序(從小到大)

希爾排序

桶排序堆排序

快排序歸併排序

相鄰兩個值比較大小,按照排序規則擺放,重複之前操作,下面**:

void

bubblesort

(vector<

int>

& nums)}}

}

以上為最基礎的氣泡排序,由於存在最優時間複雜度和最差時間複雜度,所以可以進行簡單的優化。

建立乙個flag=false;標識,當內層迴圈發生了一次交換資料就把flag=true;當其中一趟氣泡排序走完之後檢查此flag是否為true,未發生修改則直接跳出迴圈避免空迴圈沒操作。

最易於理解的排序,每次選出陣列中最值放在相應位置,下面**:

void

selectsort

(vector<

int>

& nums)}if

(j!=minindex)

}}

將陣列分為已排和待排序列,例如:0, 5,6,4,2,3 我們最開始認為0為已排序,然後從5開始向已排查找,尋找到合適位置插入。

void

insertsort

(vector<

int>

& nums)

nums[j+1]

= tmp;

//j+1因為迴圈出來是因為j--後找到的位置

}}

是一種不穩定排序(相同的元素在排序前後相對位置不變稱為穩定排序),按步長分組進行組內排序,當步長為1的時候就相當於插入排序。

void

gap_insertsort

(vector<

int>

& nums,

int start,

int gap)

nums[j + gap]

= tmp;}}

void

shellsort

(vector<

int>

& nums)

}}

根hash的鍵值差不多,桶建立出來就是有序的只要確定和桶的標號的元素存不存在就好,不適合最值差較大的陣列排序,桶會很大懂吧。

void

bucketsort

(vector<

int>

& nums)

int* bucket =

newint

[max +1]

;//桶個數=角標+1 直接下面寫釋放

memset

(bucket,0,

sizeof

(int)*

(max+1)

);//陣列初始化函式 容器名 初始值 大小

for(

int i =

0; i < nums.

size()

; i++

)int index =0;

//排序完的陣列下標

for(

int i =

0; i <= max; i++)}

delete bucket;

}

建立乙個最大堆(堆頂元素為整個堆裡最大值),每次把堆頂值和最後乙個值交換,完成排序。

void

max_heap

(vector<

int>

& nums,

int start,

int end)

if(nums[child]

>nums[father]

)else

father = child;

child =

2* father +1;

}}void

heapsort

(vector<

int>

& nums)

for(

int i = nums.

size()

-1; i >0;

)}

頭尾雙指標,選擇基準值。(快排的複雜度在於基準值的選擇 因此衍生出topk問題的目前最優演算法bfprt)

你可以把他想象成挖坑,有點拆了東牆補西牆的味道,基準值就是挖的第乙個坑,從right往前找乙個比坑小的數,然後挖了去填上乙個坑,然後從left往後找第乙個比坑小的數挖了去填上乙個坑…不斷迴圈直到left=right,最後剩下的那個坑就是最開始挖的那個數最後排序位置(相當於找乙個值在排序後的位置)只不過不是從頭或者從尾而已。

從後往前找第乙個小宇基準值的數 :左邊界和坑一起移;

從後往前找第乙個等於基準值的數:右邊界單移;

從前往後找第乙個大於基準值的數:只動坑;

pair<

int,

int>

partition

(vector<

int>

& nums,

int left,

int right)

else

if(nums[index]

== tmp)

else

}return;}

void

quicksort

(vector<

int>

& nums,

int left,

int right)

呼叫函式還是上面那個三色旗函式partition;

void

quick

(vector<

int>

& nums)

if(q.second < p.second)

}}

void

merge

(vector<

int>

&nums,

int left,

int mid,

int right)

else

}while

(i <= mid)

while

(j <= right)

index =0;

for(

int i =

0; i <= help.

size()

-1; i++)}

void

mergesort

(vector<

int>

&nums,

int left,

int right)

int mid =

(left + right)/2

;mergesort

(nums, left, mid)

;mergesort

(nums, mid +

1, right)

;merge

(nums, left, mid, right)

;}

本篇文章可以保證**均執行有效,但不一定保證你能聽懂…

複雜度就不總結了隨便一搜都有…

Java八大排序演算法的時間複雜度分析

1.氣泡排序 2.快速排序 1 最佳情況下,每次選取的基數都能將區間陣列剛好劃分成相等的2段。第一次對長度為n的整個陣列掃瞄一遍 比較n 1次 視為n 第二次已經將陣列分成2段,每段內做相同的操作 2段比較次數和為 n 1 2 1 n 1 2 1 視為n 第三次將陣列平均分成4段,每段內做相同操作 ...

八大排序演算法 C 實現及對比

1 直接插入排序 void insertsort int data,int len 2 氣泡排序 void bubblesort int data,int len 3 選擇排序 void selectsort int data,int len swap data i data max 4 希爾排序 ...

八大排序演算法的C 實現

include stdafx.h include include include include using namespace std void print vectornumv 輸出陣列 numv.at j 1 v return numv vectorselectionsort vectornu...