排序演算法 快排

2021-08-14 14:45:40 字數 1037 閱讀 1651

今天聊聊排序演算法,排序演算法平時也會用到,有很多比如,冒泡,快排,選擇,歸併排序等.今天就聊一聊快速排序演算法排序演算法的乙個宗旨就是經過一趟排序,何為一趟排序呢?就是遍歷完一次陣列,陣列中的一部分資料比另外一部分的資料都要小.當然這兩部分資料內部仍然是無序的,然後我們再對這兩部分資料分別進行排序,如此遞迴下去.所以整個演算法的核心思想就是這樣,今天介紹兩種實現快速排序的方法,一種是交換排序以及另一種方法(這種我也叫不出來方法),大家看**就能看明白.

首先看第一種方法,

void quicksort1(vector&nums, int left, int right)

swap(nums[left], nums[high]); //為什麼是和high位置交換

quicksort1(nums, left, high-1);

quicksort1(nums, high+1, right);

}}

因為演算法是從兩個端點向中間收縮,所以我們要確保leftkey,而且這乙個過程中key值一直沒動,我們需要把他放在合適的位置,此時nums[low]>key,那key還能和low位置的值交換嗎?好像不可以了,那為什麼和high位置的值交換呢,如果我們在第乙個迴圈中設定low

第二種方法:**如下

void quicksort2(vector&v, int left, int right)

v[low] = key;

quicksort2(v, left, low-1);

quicksort2(v, low+1, right);

}}

這種方法就比較好理解了,先從右邊遍歷陣列,直到遇到乙個比key值小的,然後把這個值放到low位置處,low指向下乙個位置,這時陣列中有兩個v[high]了,在low位置處(前面)的這個是正確的位置,在high處這個位置是不正確的位置.然後從左邊開始向右遍歷,直到遇到乙個比key值大的數值,然後把他放到右邊的high位置處,這時是不是陣列中有了兩個v[low]了,前面這個位置是不正確的,所以要把key值放到這個位置.接著從low處割裂開,然後對兩段陣列進行排序.

演算法 快速排序 經典快排 隨機快排

經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...

排序演算法 快排,歸併

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

排序演算法 歸併 快排

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