演算法 歸併排序與快排

2022-07-05 07:48:14 字數 2404 閱讀 2793

歸併排序是另一種不同的排序方法,因為歸併排序使用了遞迴分治的思想,所以理解起來比較容易。其基本思想是,先遞迴劃分子問題,然後合併結果。把待排序列看成由兩個有序的子串行,然後合併兩個子串行,然後把子序列看成由兩個有序序列。。。。。倒著來看,其實就是先兩兩合併,然後四四合併。。。最終形成有序序列。空間複雜度為o(n),時間複雜度為o(nlogn)。

舉個栗子:

歸併排序,將陣列前半部分後半部分分成最小單元,然後在合併

void mergesort(int array, int start, int end, int

temp) }//

在這裡建立臨時陣列,節省記憶體開銷,因為以後的temp都是在遞迴李使用的。

void mergesortmain(int array, int

len)

void printarray(int array, int

len)

cout

<

}int

main() ;

mergesortmain(array,

10);

printarray(array,

10);

return0;

}快速排序一聽名字就覺得很高階,在實際應用當中快速排序確實也是表現最好的排序演算法。氣泡排序雖然高階,但其實其思想是來自氣泡排序,氣泡排序是通過相鄰元素的比較和交換把最小的冒泡到最頂端,而快速排序是比較和交換小數和大數,這樣一來不僅把小數冒泡到上面同時也把大數沉到下面。

舉個栗子:對5,3,8,6,4這個無序序列進行快速排序,思路是右指標找比基準數小的,左指標找比基準數大的,交換之。

5,3,8,6,4 用5作為比較的基準,最終會把5小的移動到5的左邊,比5大的移動到5的右邊。

5,3,8,6,4 首先設定i,j兩個指標分別指向兩端,j指標先掃瞄(思考一下為什麼?)4比5小停止。然後i掃瞄,8比5大停止。交換i,j位置。

5,3,4,6,8 然後j指標再掃瞄,這時j掃瞄4時兩指標相遇。停止。然後交換4和基準數。

4,3,5,6,8 一次劃分後達到了左邊比5小,右邊比5大的目的。之後對左右子串行遞迴排序,最終得到有序序列。

上面留下來了乙個問題為什麼一定要j指標先動呢?首先這也不是絕對的,這取決於基準數的位置,因為在最後兩個指標相遇的時候,要交換基準數到相遇的位置。一般選取第乙個數作為基準數,那麼就是在左邊,所以最後相遇的數要和基準數交換,那麼相遇的數一定要比基準數小。所以j指標先移動才能先找到比基準數小的數。

快速排序是不穩定的,其時間平均時間複雜度是o(nlgn)。

實現**:

#include #include 

#include

#include

#include

"solution.h

"using

namespace

std;

int partition(vector &vi, int low, int

up) }

swap(vi[i+1

], vi[up]);

return i+1;}

//c++'s array range should be [low, up], the same as [low, up+1)

void quicksort(vector &vi, int low, int

up)}

void qsort(vector &vi)

intmain() ;

vector

va(a, a+11

); cout

<

before quicksort:\n";

for(auto x:va)

cout

cout

<

qsort(va);

cout

<

after quicksort:\n";

for(auto x:va)

cout

cout

<

return0;

}

快排 歸併排序

二 歸併排序 遞迴 分治的思維 分治 確定分界點 我們下面以中間值q l r 1 為分界點,理論上任何點作為分界點都可 調整區間 x 的在左邊,x的在右邊 兩個區間 遞迴 遞迴處理左右兩段 原題鏈結 題目描述 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的...

排序演算法 氣泡排序 快排 歸併排序

氣泡排序 bubble sort 也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。步驟 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同...

排序演算法 快排,歸併

從陣列中隨機選乙個數,比這個數大的放右邊,比這個數小的放左邊。快排中的乙個細節 如果乙個數等於p的時候,既可以在左邊又可以在右邊。這麼做是為了避免如果陣列中所有的數都一樣,則會造成資料的不平衡。快排的目的是能夠使得左邊和右邊的數都差不多,這樣的話時間複雜度就不會退化到o n 2 而是o n logn...