Java 快速排序,以及雙基快排

2021-07-23 17:21:26 字數 1337 閱讀 3997

/**

* 單基準快排

* 使用 quicksort(arr,0,arr.length-1) 排序整個陣列

*/private static void quicksort(int arr, int left, int right)

return;

} //lt的左邊放小於基準值的值

//gt的右邊放大於基準值的值

//lt與gt其中乙個是基準值

int lt = left, gt = right;

//基準值位置,初始在lt位置

boolean atlt = true;

//從兩側向中心併攏

while (lt < gt)

//基準值在左側,則右側遍歷,否則相反

if (atlt)

--gt;

else

++lt;

} //繼續排序被基準值分隔的兩部分

quicksort(arr, left, lt - 1);

quicksort(arr, gt + 1, right);

}

/**

* 雙基準快排

* 使用 dualpivotquicksort(arr,0,arr.length-1) 排序整個陣列

*/public static void dualpivotquicksort(int arr, int left, int right)

return;

} // left與right分別為左右基準下標(迴圈時不會改變其下標)

// 使[right]>[left]

if (arr[left] > arr[right])

int lt = left + 1; // 小於left的放在lt左邊

int gt = right - 1;// 大於right的放在gt右邊

int i = lt; // 迴圈索引

while (i <= gt) else if (arr[i] > arr[right]) else

} // 將基準交換到位,

swap(arr, left, lt - 1);

swap(arr, right, gt + 1);

// 繼續將被兩個基準值分成的三部分排序

// 此時左基準下標 lt-1 右基準下標 gt+1

dualpivotquicksort(arr, left, lt - 2);

dualpivotquicksort(arr, gt + 2, right);

dualpivotquicksort(arr, lt, gt);

}

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

快速排序是屬於交換排序的基本思想。選擇乙個基準值val,把比val小的放在前面,比val大的放在後面,最後把val放在兩個區域中間,val就到了最終的位置。很明顯快排是乙個原地排序,也是乙個不穩定排序。空間複雜度 1.可以是為新陣列開闢額外空間o n 2.當然也可以在原陣列內交換得來o 1 時間複雜...

演算法 快速排序 經典快排 隨機快排

經典快排的思路是選取陣列的最後乙個數 x,按照問題一的思路把整個陣列劃分成小於等於 x 大於 x兩個部分,將 x 和 大於 x 部分陣列的第乙個元素交換位置。此時整個陣列劃分成小於等於 x x 大於 x三個部分,也就是這一次排序將 x 值排好位置。再分別對小於等於 x和大於 x中的陣列遞迴劃分,直到...

快速排序和變種快排

快速排序 假設我們現在要對乙個陣列ar進行排序。首先我們需要隨機選擇乙個基準值 一般選陣列的首元素 然後將陣列中的其他值與其進行比較,將小於它的數放在其左側,大於的放在右側 假定按從小到大排序 這就完成了一趟快速排序 原始資料如下 ar 0 ar 1 ar 2 ar 3 ar 4 ar 5 ar 6...