排序演算法小結

2021-08-19 20:21:21 字數 1375 閱讀 1040

(排序類別,排序方法)

插入排序:直接插入、折半插入、希爾排序。

交換排序:氣泡排序、快速排序。

選擇排序:簡單選擇排序、堆排序。

歸併排序:

基數排序:

氣泡排序時間複雜度o(n^2)、空間複雜度o(1)、歸位性(每趟確定乙個元素最終位置)

快速排序、堆排序、歸併排序:平均時間複雜度為o(nlogn)。

下面分別回憶下氣泡排序、快速排序、堆排序、歸併排序。

【氣泡排序】:(大數往下沉)

void sort(int a, int len)

}}}

【快速排序】:

一般選第乙個元素為樞軸,根據樞軸將陣列分割成兩部分(前一部分關鍵字均比後一部分小),

每次一趟排序確定樞軸的位置。pivot的選取直接影響排序的好壞。(把pivot位置視為乙個坑)

建議:可取a[0],a[(len-1)/2],a[len-1]的中值作為樞軸。

int partition(int a,int low,int high)//low,high為陣列下標

void adjust_heap(int a, int len, int i)

}}

或者採用非遞迴的方式:迴圈

void adjust_heap(int a, int len, int i)

else

}}

建立大根堆函式:

void build_heap(int a, int len)  //從下往上建立堆

}

堆排序函式:

void heap_sort(int a, int len)

}

【歸併排序】

分治法的典型應用

演算法思路:將陣列分為2個子陣列a,b。如果這兩個陣列組內資料都為有序,則問題轉化為

合併兩個有序的數列。至於如何讓a,b兩個陣列組內都為有序,則將a,b各自繼續進行劃分,

類推,直到組內只有乙個元素時,可視為組內有序,再合併相鄰兩個小組。

先遞迴分解數列,再合併數列,即為歸併排序。

//合併有序a,b到c中。

void merge(int a,int len1,int b,int len2,int c)

while(i<=mid)

while(j<=last)

//此時陣列c的長度為k

for(i=0;i歸併排序函式:

void mergesort(int a,int first,int last,int tmp)

if(keymid)

}return -1;

}

排序演算法小結

1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分都小於支點資料。4...

排序演算法小結

1 歸併排序 3.區別與聯絡 遞迴是從未知推到已知,相當於把未知的東西壓入棧,等到可以算出結果了,就一步一步出棧。迭代是從已知到未知,從已知的東西一步一步推至目標。遞迴與迭代就好像一對逆元。遞迴的 更加清晰,但開銷更大,也更容易出錯,除錯較困難 而迭代的 編寫更困難,但速度和開銷較小。4.空間占用 ...

排序演算法小結

演算法過程 假設乙個無序的序列,該演算法將其分成兩部分,前一部分已經完成排序 有序,一開始時只有乙個元素 後一部分任然無序,將後面序列選擇第乙個插入到前面的有序序列,如此直到所有完全有序。複雜度 最簡單的即為,整個序列原來即有序,按照一種最 省事 的方式,我們僅需比較n 1次即可。最複雜的情況,應該...