排序 快排與歸併

2022-09-10 21:33:30 字數 1719 閱讀 9933

目錄歸併排序

1. 隨機找到乙個基準數.

2. 將所有小於他的數放在左邊,所有大的數放在右邊.

3. 最後重複以上操作,直至各部分左右指標相遇.

如gif所示,乙個無序的陣列3 5 8 1 2 9 4 7 6

把右端點作為基準數,然後左指標開始從左掃瞄,當遇=6 的數時停止,此時右指標就開始掃瞄,當遇到<=6 的數時停止,這兩個數的位置並不符合第二個基本思想,那麼就進行交換,隨後左指標再次開始掃瞄,當左右指標相遇時為第一次遍歷.

陣列被分開為兩個部分,重複上面操作.

int op[10010];//開陣列空間

void quick_sort(int op, int l, int r)

} quick_sort(op, l, j);//遞迴

quick_sort(op, j + 1, r);

}int main()

快速排序的時間複雜度為o(nlogn)這裡借用特務依昂的解釋快速排序每次將陣列區間分為兩個部分,在最理想的情況下,即所選取的基準數正好是這個區間的中位數,那麼每次分割就可以分為兩個大小相同的區間,然後接著遞迴.當你選取左端點作為基準的時候quick_sort(op, l, j),quick_sort(op, j + 1, r);這裡的遞迴不可以將i作為遞迴分界線

相應的選取右端點作為基準的時候不可以將j作為遞迴分界線.

是因為會出現單邊死迴圈,如:2 1 3 5 4

acwing785

洛谷p1177

1. 將待排序區間無限分割,分割為不可分割的子區間

2. 然後將所有的子區間進行兩兩合併,合併過程中完成排序操作,最終合併得到的新區間就是有序序列

相比於快排,歸併排序就沒有那麼多的邊界問題,也就很簡單了,而且時間複雜度都是o(nlogn)不會出現像快排那樣最多o(n^2)的情況.

#include int op[10010];

int temp[10010];

void merge_sort(int op, int l, int r)

while (i <= mid)//多餘的數加入陣列中

temp[k++] = op[i++];

while (j <= r)

temp[k++] = op[j++];

for (i = l, j = 0; i <= r; i++, j++)

op[i] = temp[j];

}int main()

acwing78

排序演算法 快排,歸併

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

排序演算法 歸併 快排

歸併排序的思想是分治法,如果想要將乙個陣列排序,那麼將這個陣列分為左區間和右區間,左區間一定是小於右區間的,再將左區間繼續劃分,右區間也繼續劃分。最後將排好序的陣列全都歸併起來,這樣聽起來像是從上向下劃分,其實歸併排序主要是是從下向上,合併的過程。先將單個元素的陣列歸併為兩個元素的有序陣列 再將包含...

快排 歸併排序

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