算法通关村第十关——快速排序

快速排序是将分治法运用到排序问题的典型例子,基本思想是:通过一个标记 pivot 元素将 n 个元素的序列划分为左右两个子序列 left 和 right,其中 left 中的元素都比 pivot 小,right 的都比 pivot 的大,然后再次对 Ieft 和 right 各自再执行快速排序,在将左右子序列排好序之后,整个序列就有序了。这里排序进行左右划分的时候是一直划分到子序列只包含一个元素的情况,然后再递归返回。

这里例子为 [6, 3, 2, 1, 4, 5, 8, 7]

 

public void quickSort(int[] array, int start, int end) {
    if (start >= end) {
        return;
    }
    // 这里就是一个对撞的双指针操作
    int left = start, right = end;
    int pivot = array[(start + end) / 2];
    
    while (left <= right) {
        while (left <= right && array[left] < pivot) {
            left++;
        }
        while (left <= right && array[right] > pivot) {
            right--;
        }
        if (left <= right) {
            int temp = array[left];
            array[left] = array[right];
            array[right] = temp;
            left++;
            right--;
        }
    }
    // 先处理元素再分别递归处理两侧分支,与二叉树的前序遍历非常像
    quickSort(array, start, right);
    quickSort(array, left, end);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值