快速排序:
快速排序由於排序效率在同爲O(nlogn)的幾種排序方法中效率較高,因此經常被採用,再加上快速排序使用了分治法的思想,算是基礎排序中比較高檔的一種排序了。
基本思想
1.先從數列中取出一個數作爲基準數,可以是第一個,也可是中間的或者最後的,但是第一步要把這個基準數與數組最後一位對換。
2.將比這個數大(小)的數全放到它的右邊,小於或等於(大於或等於)它的數全放到它的左邊。
3.對左右區間重複第二步,直到各區間只有一個數(遞歸定義)。
詳細圖示
代碼展示
public class Quick {
public static void main(String[] args) {
Integer arrA[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
Integer arrB[] = new Integer[] { 13, 1, 2, 43, 65, 23, 76, 77, 23, 11, 99 };
Integer[] arr1 = quickSortBig2Small(arrA, 0, arrA.length - 1);
System.out.println("從大到小:" + Arrays.toString(arr1));
Integer[] arr2 = quickSortSmall2Big(arrB, 0, arrB.length - 1);
System.out.println("從小到大:" + Arrays.toString(arr2));
}
/**
* 快排從大到小
*/
private static Integer[] quickSortBig2Small(Integer[] arr, int low, int high) {
// 如果開始點和結束點沒有重疊的時候,也就是指針沒有執行到結尾
if (low < high) {
// 重新獲取中間點
int mid = getIndexFromBig2Small(arr, low, high);
quickSortBig2Small(arr, low, mid - 1);
quickSortBig2Small(arr, mid + 1, high);
}
return arr;
}
/**
* 快排從小到大
*/
private static Integer[] quickSortSmall2Big(Integer[] arr, int low, int high) {
// 如果開始點和結束點沒有重疊的時候,也就是指針沒有執行到結尾
if (low < high) {
// 重新獲取中間點
int mid = getIndexFromSmall2Big(arr, low, high);
quickSortSmall2Big(arr, low, mid - 1);
quickSortSmall2Big(arr, mid + 1, high);
}
return arr;
}
/**
* 交換數組元素
*/
private static void swap(Integer[] arr, int low, int high) {
int temp = arr[low];
arr[low] = arr[high];
arr[high] = temp;
}
/**
* 獲取中間值(從大到小)
*/
private static int getIndexFromBig2Small(Integer[] arr, int low, int high) {
// 中值作爲中點
int index = (low + high) / 2;
int midNum = arr[index];
// 無論取的值是哪一個,都應該將其放在最後面
swap(arr, index, high);
while (low < high) {
// 左側值大於或者等於右側值時候,只需要移動指針即可,不需要交換( 注意 =,沒有會陷入死循環)
while (low < high && arr[low] >= midNum)
low++;
swap(arr, low, high);
// 右側值小於或者等於右側值時候,只需要移動指針即可,不需要交換
while (low < high && arr[high] <= midNum)
high--;
swap(arr, low, high);
}
return high;
}
/**
* 獲取中間值(從小到大)
*/
private static int getIndexFromSmall2Big(Integer[] arr, int low, int high) {
// 中值作爲中點
int index = (low + high) / 2;
int midNum = arr[index];
// 無論取的值是哪一個,都應該將其放在最後面
swap(arr, index, high);
while (low < high) {
// 左側值小於或者等於右側值時候,只需要移動指針即可,不需要交換( 注意 =,沒有會陷入死循環)
while (low < high && arr[low] <= midNum)
low++;
swap(arr, low, high);
// 右側值小大於於或者等於右側值時候,只需要移動指針即可,不需要交換
while (low < high && arr[high] >= midNum)
high--;
swap(arr, low, high);
}
return high;
}
}