1. 程式人生 > >劍指offer-快速排序

劍指offer-快速排序

package case99_QuickSort;

public class QuickSortOpt {

	/**
	 * 對快排進行優化 優化1:三數取中優化 優化2:優化小陣列時的排序方案 優化3:優化遞迴
	 * 
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 9, 9, 5, 8, 3, 7, 4, 6, 2 };
		Qsort(arr);
		for (int i = 0; i < arr.length; i++)
			System.out.print(arr[i] + " ");
	}

	// 排序
	public static void Qsort(int[] arr) {
		if (arr == null)
			return;
		if (arr.length == 0)
			return;
		// 快速排序
		QS(arr, 0, arr.length - 1);
	}

	// 採用遞迴的方式完成排序
	public static void QS(int[] arr, int low, int high) {
		// 優化2:陣列個數大於一定個數的時候,採用快速排序;否則,採用直接插入排序。
		int Distance = high - low;
		if (Distance > 7) {
			while (low < high) { // 優化3:優化遞迴操作
				// 獲取中樞值的位置,並且完成大小陣列的劃分
				int pivotPos = partition(arr, low, high);
				QS(arr, low, pivotPos - 1);
				low = pivotPos + 1; // 優化3:採用迭代的方法,可以縮減棧的深度。
			}
		} else
			// 直接插入排序
			InsertSort(arr, low, high);
	}

	// 直接插入
	public static void InsertSort(int[] arr, int low, int high) {
		if (low < high) {
			for (int i = low; i < high; i++) {
				if (arr[low + 1] < arr[low]) {
					int temp = arr[low + 1];
					// 記錄後移
					int j;
					for (j = low + 1; temp < arr[j]; j--) {
						arr[j] = arr[j - 1];
					}
					arr[j] = temp;
				}
			}
		}
	}

	// 獲取中樞值的位置,並且完成大小陣列的劃分
	public static int partition(int[] arr, int low, int high) {
		// 優化1:三數取中
		int m = low + (high - low) / 2;
		if (arr[m] > arr[high]) // 小的數放到low的位置
			swap(arr, m, high);
		if (arr[low] > arr[high])
			swap(arr, low, high);
		if (arr[low] > arr[m])
			swap(arr, low, m);
		int pivotKey = arr[low];
		// 從兩頭向中間開始交替靠近
		while (low < high) {
			while (low < high && arr[high] >= pivotKey)
				high--;
			arr[low] = arr[high];
			while (low < high && arr[low] <= pivotKey)
				low++;
			arr[high] = arr[low];
		}
		arr[low] = pivotKey;
		return low;
	}

	// 完成low,high位置兩個數的交換
	public static void swap(int[] arr, int low, int high) {
		int temp;
		if (arr[low] > arr[high]) {
			temp = arr[low];
			arr[low] = arr[high];
			arr[high] = temp;
		}
	}

}