算法练习bat----------05快速排序和改进的快排和随机快排

本文详细介绍了普通快速排序和随机快速排序的实现原理与过程,并通过代码示例展示了如何使用改进后的快速排序算法。改进后的快速排序将数组分为小于、等于和大于基准的三个部分,提高了排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

普通快排,最差情况下为时间复杂度O(N^2)

随机快排,最差情况下为时间复杂度O(N*logN),最好空间复杂度O(logN),最差O(N)

原始快排:将数组最后一个变量假设为X,小于等于X的放左边,大于X的放右边,然后再将拍好序的左边和右边分别再重复刚刚的动作

改进快排:将数组最后一个变量假设为X,小于X的放左边,等于X的放中间,大于X的放右边,这样的好处是中间排好序的X不用动


	public static void quickSort(int[] arr) {
		if (arr == null || arr.length < 2) {//空或长度小于2个,不用排序
			return;
		}
		quickSort(arr, 0, arr.length - 1);
	}

//随机快排,随机取一个数,让它和数组的最后一位交换,然后按最后一位进行普通快排
	public static void quickSort(int[] arr, int l, int r) {
		if (l < r) {//排序结束条件
			//swap(arr, l + (int) (Math.random() * (r - l + 1)), r);随机快排
			int[] p = partition(arr, l, r);//以数组最后一个作为比较的数,小于放左边,等于放中间,大于放右边,和荷兰国旗问题一样,只不过多了递归
			quickSort(arr, l, p[0] - 1);//递归左边,不包括等于的数字
			quickSort(arr, p[1] + 1, r);//递归右边,不包括等于的数字
		}
	}

	public static int[] partition(int[] arr, int l, int r) {
		int less = l - 1;
		int more = r;
		while (l < more) {
			if (arr[l] < arr[r]) {
				swap(arr, ++less, l++);
			} else if (arr[l] > arr[r]) {
				swap(arr, --more, l);
			} else {
				l++;
			}
		}
		swap(arr, more, r);//默认最后一个数不参与排序,等排完和大于区域的第一个数交换
		return new int[] { less + 1, more };
	}

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值