加载中...

快速排序

image-20230302215746755

	/**
	 * @param arr 需要排序的数组
	 * @param l   数组最左下标
	 * @param r   数组最右下标
	 */
	public static void quickSort(int[] arr, int l, int r) {
		if (l >= r) {// 相等的时候即为只剩一个元素,一个元素是有序的
			return;
		}
		int pivotIndex = partition(arr, l, r);// 实现了对子数组的原址重排,并且返回对应的主元下标
		quickSort(arr, pivotIndex + 1, r);
		quickSort(arr, l, pivotIndex - 1);
	}

	/**
	 * @param arr 原排序数组
	 * @param l   子数组数组最左下标
	 * @param r   子数组数组最右下标
	 * @return 主元下标 pivotIndex
	 */
	private static int partition(int[] arr, int l, int r) {
		int pivot = arr[r];
		int t;// 用作交换的变量
		int i = l - 1;// 指针i
		int j = l;// 指针j
		for (; j < r; j++) {// j负责遍历数组
			if (arr[j] < pivot) {
				i++;
				if (i != j) {// 优化,体现稳定性,可有可无
					t = arr[i];
					arr[i] = arr[j];
					arr[j] = t;
				}
			}
		}
		i++;
		if (i < r) {// 交换主元位置
			t = arr[i];
			arr[i] = arr[j];
			arr[j] = t;
		}
		return i;
	}
posted @ 2023-03-02 23:43  ChuenSan  阅读(18)  评论(0编辑  收藏  举报