Java快速排序以及其優化(雙路快排 三路快排)

2021-09-12 17:21:00 字數 2128 閱讀 5161

快速排序是屬於交換排序的基本思想。選擇乙個基準值val,把比val小的放在前面,比val大的放在後面,最後把val放在兩個區域中間,val就到了最終的位置。

很明顯快排是乙個原地排序,也是乙個不穩定排序

空間複雜度:1.可以是為新陣列開闢額外空間o(n) 2.當然也可以在原陣列內交換得來o(1)

時間複雜度:o(nlogn)

1.把陣列第乙個元素作為val,先用變數val存下來,設定兩個指標,i用來標記遍歷的元素,j-1用來標記2.i= start+1;j= start;遇到array[i]小於val的情況,就把array[i]和array[j]交換,小於區域擴張,j++;i++;遇到大於val的情況,就繼續判斷下乙個i,i++;直到i>=j,把第乙個元素和第j個元素交換,返回j的下標,為下一次遞迴邊界做準備。

3.運用遞迴,接著把[start,key-1]和[key+1,end]進行第2步操作。

4.重複2.3.步,直到start>=end,退出遞迴。

start(j)--i----------------------end

start-----j---------i----------end

public static int qiucksort(int array)

private static void qiuck(int array ,int start, int end)

//l…<……>…r

//v……j……i

private static int selectionkey(int array, int start, int end)

private static void qiuck2(int array ,int start, int end)

private static int selectionkey2(int array, int start, int end)

swap(array,start,j);

return j;

}

1.當陣列重複元素過多時,每次比較==val的元素會浪費時間,雖浪費的時間不足一提,但是還是可以優化的。

解決:三路快排,把等於value的元素放在另乙個區間內,不參與下次的排序。

在二路排序的基礎上,把等於value的元素放在另乙個區間內,不參與下次的排序。

1.避免陣列近乎有序,先隨機取出乙個val,和第乙個元素交換。

2.定義三個指標,lt從頭開始指向小於val的區域後乙個元素lt = start-1,i指向目前比較的元素i= start,gt從尾開始指向大於val的第乙個元素gt = end+1。保證一開始都是空集合。

3.當i所指向的值小於等於val,swap(i,lt+1),lt++。當i所指向的值大於等於val,swap(i,gt-1)gt--,否則i++。直到i>=gt排序完成。將start和lt交換。

4.[start,lt-1]和[gt,end]重複2.3直到start>end,排序完成。

start----lt----i----gt-----end

小於 [start,lt-1]

等於[lt,gt-1]

大於[gt,end]

public static void qiucksort3(int array)

private static void qiuck3(int array ,int start, int end)

int random = (int)(math.random()*(end-start+1)+start);

swap(array,random,start);

//找到乙個隨機key

int value = array[start];

int lt = start; int gt = end+1; int i = start+1;

for(;ivalue)

}swap(array,lt,start);

//直接跳過相等元素的比較

qiuck3(array,start,lt-1);

qiuck3(array,gt,end);

}

注:在此省略了直接插入和swap交換函式。

這樣一步一步優化下來,快排適用了任何資料模式,具有了穩定的時間複雜度。

Java雙路快速排序演算法

針對序列中重複元素出現頻率非常高,隨機化快速排序演算法退化成o n 2 的問題 雙向開始遍歷 當arr i arr l arr j arr l 時暫停 進行歸併 arr i 與arr j 交換元素 當i j時遍歷完畢 雙路快速排序演算法,對解決重複性高的元素集合效率高 public static s...

排序 快速排序及其優化(Java)

演算法思路 從待排元素中選取任意乙個元素,把它當做分割槽點 基準值 在遍歷的時候比基準值小的放在他的左邊,比基準值大的放在右邊。在一次遍歷結束後,基準元素在最終位置 穩定行 不穩定演算法,擴充套件問題 如何在o n 的適建範圍內找到乙個無需陣列的k大元素 方法一 遞迴方法 優化1.當排序的集合幾乎接...

雙路快速排序

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