快排之双向扫描分区

快排之双向扫描分区

public class 快排之双向扫描分区 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int[] arr = { 9, 8, 7, 6, 5, 0, 4, 8, 3, 2, 8, 7, 10 };
		quickSort(arr, 0, arr.length - 1);
		for (int num : arr) {
			System.out.print(num + " ");
		}
	}

	private static void quickSort(int[] arr, int begin, int end) {
		if (begin >= end) {
			return;
		}
		int indexOfMid = partition(arr, begin, end);
		quickSort(arr, begin, indexOfMid - 1);
		quickSort(arr, indexOfMid + 1, end);
	}

	private static int partition(int[] arr, int begin, int end) {
		int pivot = arr[begin];
		int sp = begin + 1;
		int bigger = end;
		while (sp <= bigger) {
			while (sp <= bigger && arr[sp] <= pivot) {// 遇大停,不能越界
				sp++;
			}
			while (sp <= bigger && arr[bigger] > pivot) {// 遇小停,不能越界
				bigger--;
			}
			if (sp < bigger) {// = 不用加,没有意义,不能越界
				swap(arr, sp, bigger);
			}
		}
		swap(arr, begin, bigger);
		return bigger;
	}

	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

}

猜你喜欢

转载自blog.csdn.net/a739260008/article/details/86537860