雙路快速排序

2021-10-03 21:04:31 字數 1515 閱讀 6628

雙路快速排序的時間複雜度為o(nlog2n),空間複雜度為o(n)

雙路快速排序的核心思想:單路快排會將等於v的元素分配在左側或者右側,當陣列中有大量重複元素時,這將會導致左右兩側的元素數量極度不均衡,時間複雜度退化到o(n^2),如下圖所示:

雙路快排是將等於v的部分近乎平均的分配在左右兩側,避免了該問題

說明:雙路快速排序在等於v的時候也要交換位置,是為了避免大量等於v的元素集中在左側或者右側

排序的步驟和示意圖如下:

i從l+1的位置開始遞增,直到第乙個大於等於v的元素

j從r的位置開始遞減,直到第乙個小於等於v的元素

兩塊藍綠色區域分別歸到左側和右側,交換i和j指向的元素,並且i ++,j--,可以看出等於v的元素近乎均分在了左右兩側

繼續次操作,直到i >j,注意此時j指向的是最後乙個小於等於v的元素,i指向的是第乙個大於等於v的元素,所以交換j與l位置的元素,本層雙路快排結束

重複上述步驟,直到所有元素有序

**如下:

template

void quicksort2ways(t arr, int n)

// 對arr[rangel,ranger]部分進行快速排序

template

void _quicksort2ways(t arr, int rangel, int ranger)

if (ranger - rangel <= 16)

int index = _quickpartition2ways(arr, rangel, ranger);

_quicksort2ways(arr, rangel, index - 1);

_quicksort2ways(arr, index + 1, ranger);

}// 雙路快速排序的partition

// 返回p, 使得arr[rangel,index] <= arr[index] ; arr[index+1,ranger] >= arr[index]

// 雙路快排處理的元素正好等於arr[index]的時候要注意,詳見下面的注釋:)

template

int _quickpartition2ways(t arr, int rangel, int ranger)

swap(arr[j], arr[rangel]);

return j;

}

快速排序之雙路快速排序

我們知道快排的一般步驟是 1.選取最左邊的數為基準數 2.從右邊開始選取乙個小於基準數的元素 3.從左邊開始選取乙個大於基準數的元素 4.交換這兩個元素 5.重複2 3 4步直至左右兩邊移到同一位置,交換基準數與當前元素 void quick sort int begin,int end left ...

雙路快速排序法

快速排序法的優化 雙路快速排序 上一節我們自己動手寫的乙個快速排序的演算法,在隨機數測試中表現得非常好,然而,我們在用高度有序的陣列進行測試的時候,發現快速排序的效率變得異常的低下,比歸併排序的效率低得多了,近似退回了o n 2 的複雜度,這是為什麼呢?首先讓我們來分析一下歸併排序的演算法思想,歸併...

C 實現快速排序 雙路快速排序 三路快速排序

從左向右依次遞迴 如果 陣列中的元素都相等,就會變成 n 級別的複雜度演算法 public class quicksort public static void sort t arr where t system.icomparable public static void sort2 t arr ...