Java数据结构与算法——快速排序

排序算法

快速排序

将一个无序的数组分为两个无序的数组
其中一个数组的最大值小于等于另一个数组的最小值
两个数组各自进行排序后拼接在一起就是完整的有序的数组
1.取无序数组左右边界下标为临时指针left和right
2.获取数组中轴值arr[(left + right) / 2]
3.在left<right的循环中判断
arr[left] < 中轴值,如果为true,left+1;如果为false记录当前下标left
arr[right] > 中轴值,如果为true,right-1;如果为false记录当前下标right
如果left >= right,说明两个无序已经遍历结束,直接break
否则将左边较大的值替换右边较小的值
并且如果当前left下标所在的值等于中轴值,将交换前right的下标向左一位
如果当前right下标所在的值等于中轴值,将交换前left的下标向右一位

4.步骤3结束后,中轴值左侧的值一定小于等于中轴值
中轴值右侧的值一定大于等于中轴值
递归调用当前方法,将中轴值左右两个数组再次根据各自的中轴值细分为4个数组
不断细分后,当每个数组长度趋近于1时,这个整体的数组就一定是有序的
public static void quickSort(int[] arr, int left, int right) {
		int l = left;// 数组左边边界的下标
		int r = right;// 数组右边边界的下标
		int pivot = arr[(left + right) / 2];// 中轴值
		int temp = 0;// 交换值的临时变量

		// 比pivot小的放到左边数组
		// 比pivot大的放到右边数组
		while (l < r) {
			// 一直找到左边有数大于中轴的数为止
			while (arr[l] < pivot) {
				l++;
			}
			// 一直找到右边有数小于中轴的数为止
			while (arr[r] > pivot) {
				r--;
			}
			if (l >= r) {// 说明中轴数左边都是小于 pivot的值,右边都是大于pivot的值
				break;
			}
			// 将左边较大的值还给右边较小的值
			temp = arr[l];
			arr[l] = arr[r];
			arr[r] = temp;

			// 如果交换后左边的值等于中轴值,说明未交换前右边的值也是等于中轴值的,所以右边指针向左移一位
			if (arr[l] == pivot) {
				r--;
			}
			// 如果交换后右边的值等于中轴值,说明未交换前左边的值也是等于中轴值的,所以左边指针向右移一位
			if (arr[r] == pivot) {
				l++;
			}
		}

		// 以上操作后中轴值pivot左边数组的值小于等于右边数组的值
		// l==r 时需要 l++,r--,否则会造成堆栈溢出
		if (l == r) {
			l++;
			r--;
		}
		// 递归调用来完成左右数组的排序
		if (left < r) {// 向左边的数组递归
			quickSort(arr, left, r);
		}
		if (right > l) {// 向右边的数组递归
			quickSort(arr, l, right);
		}
	}
测试
		int[] arr = new int[10000];
		for (int i = 0; i < 10000; i++) {
			arr[i] = (int) (Math.random() * 10000);
		}
		long c1 = System.currentTimeMillis();

		quickSort(arr, 0, arr.length - 1);
		long c2 = System.currentTimeMillis() - c1;
		System.out.println("总耗时:" + c2);
		// 总耗时:2
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值