Java雙路快速排序演算法

2021-07-28 14:45:46 字數 1181 閱讀 5069

-針對序列中重複元素出現頻率非常高,隨機化快速排序演算法退化成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 ...