高階排序 04 快速排序 雙路排序

2021-09-14 01:19:44 字數 877 閱讀 8027

雙路排序要解決的問題

什麼情況下, i > j ,如下圖:

什麼情況下,i < j ,如下圖:

什麼情況下,i == j ,如下圖:

為什麼 while(i <= r && arr[i].compareto(v) < 0) 不能是 while(i <= r && arr[i].compareto(v) <= 0),見下圖:

public class quicksort2ways 

// 雙路快速排序的partition

// 返回p, 使得arr[l...p-1] <= arr[p] ; arr[p+1...r] >= arr[p]

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

private static int partition(comparable arr, int l, int r)

swap(arr, l, j);

return j;

}// 遞迴使用快速排序,對arr[l...r]的範圍進行排序

private static void sort(comparable arr, int l, int r)

int p = partition(arr, l, r);

sort(arr, l, p-1 );

sort(arr, p+1, r);

}public static void sort(comparable arr)

private static void swap(object arr, int i, int j)

// 測試 quicksort

public static void main(string args)

}

高階排序演算法之雙路快速排序

對於具有大量重複資料的排序按照之前的方式效能會很低,現在我們增加兩個標誌,想辦法把大量重複的資料分到兩部分,例如設定v作為標誌資料,讓等於v的資料分為兩部分,如下圖所示,這樣可以避免兩邊的資料出現一邊倒的情況。根據以上演算法的思想,修改如下 雙路快速排序演算法 解決具有大量重複源資料排序慢的問題 t...

快速排序之雙路快速排序

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

雙路快速排序

雙路快速排序的時間複雜度為o nlog2n 空間複雜度為o n 雙路快速排序的核心思想 單路快排會將等於v的元素分配在左側或者右側,當陣列中有大量重複元素時,這將會導致左右兩側的元素數量極度不均衡,時間複雜度退化到o n 2 如下圖所示 雙路快排是將等於v的部分近乎平均的分配在左右兩側,避免了該問題...