1. 程式人生 > >Java-經典排序演算法(二)——快速排序

Java-經典排序演算法(二)——快速排序

快速排序

快速排序之所以比較快,是因為相比氣泡排序,每次交換是跳躍式的。每次排序的時候設定一個基準點,將小於等於基準點的數全部放到基準點的左邊,將大於等於基準點的數全部放到基準點的右邊。這樣在每次交換的時候就不會像氣泡排序一樣只能在相鄰的數之間進行交換,交換的距離就大得多了。因此總的比較和交換次數就少了,速度自然就提高了。當然在最壞的情況下,仍可能是相鄰的兩個數進行了交換。因此快速排序的最差時間複雜度和氣泡排序是一樣的,都是 O(N 2 ),它的平均時間複雜度為 O (NlogN)。

快速排序運用了“二分法”思想:

程式碼如下:

// 這段程式碼是我參照《啊哈!演算法》裡的C語言程式碼改編的Java版本,具體講解可以去參照《啊哈!演算法》,也可以去參照其他快速排序的程式碼。

	public static int[] quickSort(int[] arr, int left, int right) {  // 剛開始時的left為0,right為arr.length-1
		int i = 0, j = 0, t = 0, temp = 0;
		if (left <= right) {
			temp = arr[left];
			i = left;
			j = right;
			while (i != j) {
				while (arr[j] >= temp && i < j) { // 先從右往左找
					j--;
				}
				while (arr[i] <= temp && i < j) { // 再從左往右找
					i++;
				}
				if (i < j) {
					t = arr[i];
					arr[i] = arr[j];
					arr[j] = t;
				}
			}
			arr[left] = arr[i];
			arr[i] = temp;
			quickSort(arr, left, i - 1); // 遞迴處理
			quickSort(arr, i + 1, right);
		}
		return arr;
	}