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