演算法筆記02 排序演算法

2021-10-03 18:43:05 字數 1551 閱讀 1090

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 ...