2.快速排序
前言
快速排序可以說是所有排序算法裏最常用、最優秀、最效率的算法。它是冒泡排序的改進版。就像它的名字一樣,“快速”!
實現思路
實現思路是非常有趣的:
- 1.先一個基準數(一般選擇第一個數。即,index = 0)。
- 2.來個while,從數組最右邊開始找比基準數小的數,記錄下標爲 r。
- 3.在再來個while,從數組最左邊開始找比基準數大的數,記錄下邊爲l。
- 4.交換兩個數的位置。即下標 r 和下標 l 的數交換。
- 5.當找到r == l 的時候。即,相遇的時候,第一次排序已經完成。此時,必然走到數組的中間的數。
- 6.基準數(index = 0)和 中間數交換。
- 7.此時原來的基準數到了中間,根據原來的基準數切分爲兩個數組(都不包含原基準素)。
- 8.分別給兩個數組做 上訴 1-7 的操作(開始遞歸)。
實現代碼
public <T extends Comparable<T>> void quickSorting(T[] array, int left, int right) {
int r, l;
if (left > right) return;
// 基準數
T temp = array[left];
l = left;
r = right;
while (l != r) {
/**
* 要先從右往左找
* 如果比基準數大,就一直找下去,直到找到比基準數小的
*/
while ((array[r].compareTo(temp) >= 0) && l < r) r--;
/**
* 要先從左往右找
* 如果比基準數小,就一直找下去,直到找到比基準數大的
*/
while ((array[l].compareTo(temp) <= 0) && l < r) l++;
if (l < r) {
/**
* 交換
*/
T t = array[l];
array[l] = array[r];
array[r] = t;
}
}
/**
* 基準數與中間位置的數字交換
*/
array[left] = array[l];
array[l] = temp;
/**
* 繼續處理左邊的,這裏是一個遞歸的過程
*/
quickSorting(array, left, l - 1);
/**
* 繼續處理右邊的,這裏是一個遞歸的過程
*/
quickSorting(array, l + 1, right);
}
運行
public static void main(String args[]) {
Integer[] object = {26, 19, 7, 37, 27, 57, 67, 99, 87, 17};
QuickSort quickSorting = new QuickSort();
quickSorting.quickSorting(object, 0, object.length - 1);
System.out.println("\n快速排序\n");
for (int i : object) {
System.out.print(i + " ");
}
}