-針對序列中重複元素出現頻率非常高,隨機化快速排序演算法退化成o(n^2)的問題
-雙向開始遍歷
-當arr[i]>=arr[l],arr[j]<=arr[l]時暫停
-進行歸併
-arr[i]與arr[j]交換元素
-當i=j時遍歷完畢
// 雙路快速排序演算法,對解決重複性高的元素集合效率高
public
static
super t>> void
quicksort2(t arr, int n)
// 對arr[l...r]部分進行雙路快速排序
private
static
super t>> void
sonofquicksort2(t arr, int l, int r)
int index = partition2(arr, l, r);
sonofquicksort2(arr, l, index - 1);
sonofquicksort2(arr, index + 1, r);
}// 對arr[l...r]部分進行partition分治操作,返回值是作為雙路分界點
private
static
super t>> int
partition2(t arr, int l, int r)
swap(arr[l], arr[j]);
return j;
}public
static
void
swap(t a, t b)
快速排序演算法消耗時間316ms雙路快速排序演算法消耗時間199ms
雙路快速排序
雙路快速排序的時間複雜度為o nlog2n 空間複雜度為o n 雙路快速排序的核心思想 單路快排會將等於v的元素分配在左側或者右側,當陣列中有大量重複元素時,這將會導致左右兩側的元素數量極度不均衡,時間複雜度退化到o n 2 如下圖所示 雙路快排是將等於v的部分近乎平均的分配在左右兩側,避免了該問題...
高階排序演算法之雙路快速排序
對於具有大量重複資料的排序按照之前的方式效能會很低,現在我們增加兩個標誌,想辦法把大量重複的資料分到兩部分,例如設定v作為標誌資料,讓等於v的資料分為兩部分,如下圖所示,這樣可以避免兩邊的資料出現一邊倒的情況。根據以上演算法的思想,修改如下 雙路快速排序演算法 解決具有大量重複源資料排序慢的問題 t...
快速排序之雙路快速排序
我們知道快排的一般步驟是 1.選取最左邊的數為基準數 2.從右邊開始選取乙個小於基準數的元素 3.從左邊開始選取乙個大於基準數的元素 4.交換這兩個元素 5.重複2 3 4步直至左右兩邊移到同一位置,交換基準數與當前元素 void quick sort int begin,int end left ...