1.歸併排序
歸併排序將整體陣列不斷分成更小的陣列,最終結果是所有陣列中只含有乙個元素,然後兩兩不斷合併。時間複雜度為o(nlogn)
比如現在有陣列
第一次劃分,,
第二次劃分,,,,
第三次劃分,,,,,,,,
開始兩兩合併排序
第一次合併, ,,,
第二次合併,,
第三次合併,
歸併排序中有著遞迴的思想,不斷將陣列劃分成更小的陣列,在這種遞迴的思想中不妨想一下劃分的最終狀態——陣列中只含有乙個元素,然後反過來向上推演。
歸併排序關鍵函式如下:
void
combine
(int left,
int middle,
int right)
else
}while
(i<=middle)
while
(j<=right)
for(k=left;k<=right;k++
)return;}
void
mergesort
(int left,
int right)
return
;}
2.快速排序
快速排序首先需要選取乙個pivot,每一次快速排序可以確定乙個數的最終位置
比如現在有陣列
第一次快速排序:
第二次快速排序:
第三次快速排序:
快速排序同樣也是將乙個大問題分解為更小的問題,時間複雜度為o(nlogn)
void
quicksort
(int arr,
int left,
int right)
while
(i;//從左邊開始不斷將右指標左移,尋找到第乙個大於pivot的數
if(i} arr[i]
=pivot;
//當左右指標重合時,將pivot的值賦值給左指標指向的位置
quicksort
(arr,left,i)
;//將pivot左右兩邊的陣列進行快速排序
quicksort
(arr,i+
1,right);}
return
;}
快速排序練習題:尋找陣列中第k小的數
尋找陣列中第k小的數不用將整個陣列進行排序,在快速排序演算法的基礎上,在每一次快排結束後進行一次判斷即可
int
quicksort
(int arr,
int left,
int right,
int k)
while
(i;//從左邊開始不斷將右指標左移,尋找到第乙個大於pivot的數
if(i} arr[i]
=pivot;
//當左右指標重合時,將pivot的值賦值給左指標指向的位置
if(i>k)
else
}return arr[k]
;}
演算法筆記2 排序
1.選擇排序 首先,找到陣列中最小的那個元素,其次,將他和陣列第乙個元素交換位置,再次,在剩下的元素中找到最小的元素,將他和陣列的第二個元素交換位置。如此反覆,直到將整個陣列排序。不斷的選擇剩餘元素的最小值 2.插入排序 對部分有序陣列很有效 為了給要插入的元素騰出空間,我們需要將其餘所有元素在插入...
演算法筆記演算法初步(4 1排序)
1.選擇排序 每次在待排序區間中選擇最小的往前排,隨著排序已排序區間不斷後移 include 選擇排序 int a 6 int n 5 int main int n 5 int main int n 5 int main printf n sort a,a 5 a 0 a 4 五個數 for int...
演算法筆記(二) 排序演算法(一)
關於排序演算法我打算拆開幾個部分來講,在講解前先宣告幾點注意事項。筆者使用的是c 但是演算法部分盡量不過多的使用c 語言的特性。文 現的swap,print arry演算法在後文中直接呼叫,就不再贅述。void print arry const vector int array 列印陣列 void ...