分而治之(D&C) —— 快速排序

分而治之

一种不断把大问题缩小,直至问题达到最小能解决
解决思路

  • 寻找基线条件。问题最小,最能方便解决问题的条件
  • 不断把问题缩小,不断接近基线条件。

ps:分而治之算法一般能使用递归进行实现

快速排序算法

快速排序算法是一种使用分而治之策略解决的算法

第一步:寻找基线条件

当排序的元素个数为 0或1的时候,排序会变得很简单,不需要进行排序就已经是排好顺序的数组。因此选定基线条件为 排序元素个数为 0或1

  • 伪代码
public int[] quickSort(int[] intArray) {
		if (intArray.length <= 1) {
			return intArray;
		}
		else {
			// 缩小问题接近基线条件
		}
	}

第二步:缩小解决的问题,逼近基线条件

逼近基线条件是数组不断的减少,而且我们的目的是进行数组的排序。因此有人想到了排序的数组是由多个已经排好顺序的数组组成,怎么把这些已经排好序的数组连在一起,于是想出了基准点,(从大到小排序)比基准点小的排在右边,大的排到坐标。快速排序的思路如下:

  1. 随机找一个基准点
  2. 按基准点把大数组分为小数组,左大右小
  3. 利用 左大右小 的数组重复步骤 1。直至达到基线条件: 数组元素为空或1

Java实现代码

public Integer[] quickSort(Integer[] intArray) {
		if (intArray.length <= 1) {
			return intArray;
		}
		else {
			// 缩小问题接近基线条件
			int baseNumber = intArray[0];
			ArrayList<Integer> greaterArrList = new ArrayList<Integer>();
			int greatNum = 0, lessNum = 0;
			ArrayList<Integer> lessArrList = new ArrayList<Integer>();
			for (int i=1; i<intArray.length; i++) {
				int ele = intArray[i];
				if (ele > baseNumber) {
					greaterArrList.add(ele);
					greatNum++;
				}
				else {
					lessArrList.add(ele);
					lessNum++;
				}
			}
			
			// return quickSort(greaterArr) + [baseNumber] + quickSort(lessArr)
			Integer[] greaterArr = new Integer[greatNum];
			Integer[] lessArr = new Integer[lessNum];
			greaterArr = greaterArrList.toArray(greaterArr);
			lessArr = lessArrList.toArray(lessArr);
			
			Integer[] sortArr = new Integer[intArray.length];
			Integer[] greaterSort = quickSort(greaterArr);
			Integer[] lessSort = quickSort(lessArr);
			for (int i = 0; i < greaterSort.length; i++) {
				sortArr[i] = greaterSort[i];
			}
			sortArr[greatNum] = baseNumber;
			for (int i = 0; i < lessSort.length; i++) {
				sortArr[greatNum + 1 + i] = lessSort[i];			
			}
			return sortArr;
		}

拓展:求和 Sum(n) = 1+2+3+4+....+n 使用 分而治之

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fenciso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值