排序之快速排序

2021-10-04 19:20:21 字數 1854 閱讀 8138

這裡按照從小到大排序講解,快速排序是把一組數字中的乙個數作為中軸,然後把陣列中的比中軸大的數都移動到中軸的右邊,把比中軸小的數都移動到中軸的左邊。當移動過後再將中軸兩邊的數字分別進行上述操作,直到最後無法再分便完成排序。其實該過程是乙個遞迴的過程。

這裡以 3 6 4 2 5 1 3 這組數字為例,為了便於處理,約定每次都把最左邊的數字作為中軸。

1. 首先把最左邊的3作為中軸,並在陣列的最左邊和最右邊分別設定乙個索引用於遍歷陣列。

2. 然後約定右邊的索引先向左遍歷,當遇到比中軸小的數字時停止遍歷,然後此時把右邊索引指向的數字移至左邊索引的位置。

3. 右邊的索引的數字移至左邊後,開始讓左邊的索引向右依次遍歷,當遇到比中軸大的數字時停止遍歷,然後此時把左邊索引指向的數字移至右邊邊索引的位置。

4. 左邊的索引的數字移至右邊後,繼續讓右邊索引向左遍歷。重複此步驟直到左右兩邊的索引指向了同乙個位置。

5. 當左右索引指向了同乙個位置後停止遍歷,然後將中軸數 3 放置在左右索引指向的位置。

6. 此時便發現,中軸數字 3 的左邊全是小於或等於 3 的數,右邊全是大於或等於 3 的數。這樣第一輪便完成,然後後面便是對中軸 3 兩邊的數字分別進行上述所示步驟,一直如此直到不可再分,這是乙個遞迴的過程。

/**

* 傳入陣列,以及左邊和右邊的起始索引。

* @param array

* @param left 左邊起始索引

* @param right 右邊起始索引

*/public static void quicksort(int array, int left, int right)

//將最左邊的數作為中軸數。

int pivot = array[left];

//把左右的起始索引存下來,以便後續遞迴使用。

int l = left;

int r = right;

//當左索引小於右索引時就一直遍歷。

while (left < right)

//若此時左索引小於右索引,將右索引指向的數字移至左索引處

if (left < right)

//然後左邊索引向右依次遍歷,直到遇到小於中軸數的數時停止遍歷

while (left < right && array[left] <= pivot)

//若此時左索引小於右索引,將左索引指向的數字移至右索引處

if (left < right)

//若左索引等於右索引,則將中軸數移至左右索引指向的位置。

if (left == right)

}//對中軸兩邊的數字分別遞迴進行上述步驟。

quicksort(array, l, left - 1);

quicksort(array, left + 1, r);

}

排序之快速排序

快速排序的在內排中起到比較重要的作用,平均時間複雜度達到o nlogn 公升序快速排序 1 int partition vector vi,int start,int end 11 vi start key 12return start 13 14void quickcore vector vi,i...

排序之快速排序

有沒有既不浪費空間又可以快一點的排序演算法呢?那就是 快速排序 啦!光聽這個名字是不是就覺得很高階呢。假設我們現在對 6 1 2 7 9 3 4 5 10 8 這個10個數進行排序。首先在這個序列中隨便找乙個數作為基準數 不要被這個名詞嚇到了,就是乙個用來參照的數,待會你就知道它用來做啥的了 為了方...

排序之快速排序

該方法的基本思想是 1 先從數列中取出乙個數作為基準數。2 分割槽過程,將比這個數大的數全放到它的右邊,小於或等於它的數全放到它的左邊。3 再對左右區間重複第二步,直到各區間只有乙個數 o nlogn 出處 includeusing namespace std void quicksort int ...