内排序_快速排序

快速排序

快速排序是8种内排序之一,算是比较快的一种排序方式了。

直接上代码:

	public static void main(String[] args) {
		int[] arr = new int[10];
//		填充数组
		arr = fillArray(arr);
//		快速排序
		quickSort(arr, 0, arr.length - 1);
//		展示结果
		for (int i : arr) {
			System.out.print(i + ",");
		}
	}

	/**
	 * 对数组进行快速排序
	 * 
	 * @param arr
	 *            要排序的数组
	 * @param left
	 *            左边界
	 * @param right
	 *            右边界
	 */
	public static void quickSort(int[] arr, int left, int right) {
		// 设置出口
		if (left >= right)
			return;
		// 确定轴值
		int pivotindex = findPivot(left, right);
		// 将轴值移动到数组最末端,以便于等下交换
		swap(arr, pivotindex, right);
		// 使用分割确定轴值的最终位置
		int k = partition(arr, left - 1, right, arr[right]);
		// 将轴值交换回最终位置
		swap(arr, k, right);
		// 递归轴值左侧
		quickSort(arr, left, k - 1);
		// 递归轴值右侧
		quickSort(arr, k + 1, right);
	}

	/**
	 * 根据轴值分割数组,并确定轴值的最终位置
	 * 
	 * @param arr
	 *            要排序的数组
	 * @param left
	 *            左边界
	 * @param right
	 *            右边界
	 * @param pivot
	 *            轴值
	 * @return 轴值的最终位置
	 */
	private static int partition(int[] arr, int left, int right, int pivot) {
		// 使用do……while循环让左右边界开始检测需要交换的值的角标
		do {
			// 从左侧检测比轴值大的元素的角标,如果有,循环就结束了
			while (arr[++left] < pivot)
				;
			// 从右侧检测比轴值小的元素的角标,如果有循环就结束了,此处因为要防止右边界到达-1,所以多设置一个!=0的条件
			while (right != 0 && arr[--right] > pivot)
				;
			// 如果有需要交换的角标,就交换值
			swap(arr, left, right);

		} while (left < right);
		// 纠正最后左右边界交错后的那次交换
		swap(arr, left, right);
		// 因为左侧边界-1过,所以插入左右之间时,应该选择左侧的边界
		return left;
	}

	/**
	 * 交换数组中数的方法
	 * 
	 * @param arr
	 *            要交换的数组
	 * @param i
	 *            要交换的角标
	 * @param j
	 *            要交换的角标
	 */
	private static void swap(int[] arr, int i, int j) {
		int temp = arr[i];
		arr[i] = arr[j];
		arr[j] = temp;
	}

	/**
	 * 获取轴值角标的方法
	 * 
	 * @param left
	 *            左边界
	 * @param right
	 *            右边界
	 * @return 轴值的角标
	 */
	private static int findPivot(int left, int right) {
		// 这里采用简单的中值法
		return (left + right) / 2;
	}

	/**
	 * 随机填充数组
	 * 
	 * @param arr
	 *            要填充的数组
	 * @return 填充完毕的数组
	 */
	private static int[] fillArray(int[] arr) {
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 1000 + 1);
		}
		return arr;
	}

需要注意的是,快速排序仅在大数据量的情况下才会比那些更简单些的排序快。

你可能感兴趣的:(内排序_快速排序)