雙路排序要解決的問題
什麼情況下, 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的部分近乎平均的分配在左右兩側,避免了該問題...