選擇排序(從小到大)
插入排序(從小到大)
希爾排序
桶排序堆排序
快排序歸併排序
相鄰兩個值比較大小,按照排序規則擺放,重複之前操作,下面**:
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...