快速排序的图文讲解

快速排序是对冒泡排序的一种改进,是通过每一趟排序,将要排序的数组(或后续讲解的集合)分割成两个独立的部分。其中,一部分的所有数据比另一部分的所有数据都要小。然后通过递归重复这种操作,对分割后的两部分数据分别进行快速排序,最终达到整个数据都是有序排列的。

假定要排序的数组是int[] nums = new int[]{4,5,6,7,3,2,1};

单向扫描法
选定数组的一个元素,将之称为“主元”。之后,扫描一趟数组,将大于或等于主元的元素放在主元的右边,把小于或等于主元的元素放在主元的左边,这个过程被称为用主元分割数组。具体做法是:

a. 选定数组的第一个元素(即 nums 数组中的元素 4)作为主元。

b. 定义两个标记变量 sp 和 bigger,它们都是数组下标。其中 sp 表示 1 中,在从左往右扫描一趟数组的过程中,当前正在扫描的位置,它会向右移动;bigger 是边界,其右侧的数据大于或等于主元。初始时,sp 指向数组的第二个元素,bigger 指向数组的最后一个元素,如图所示。

在这里插入图片描述

c. 假设数组名是 arr,第一趟的比较流程是:在 sp≤bigger 的情况下循环,比较arr[sp]<=主元是否成立,如果是,sp 右移一位;否则,就交换 arr[sp]和 arr[bigger],并将 bigger 的位置左移一位(注意 sp 原地不动),第一次比较过程如图所示。

数据交换前:

在这里插入图片描述

数据交换后:

在这里插入图片描述

bigger 左移一位:

在这里插入图片描述

d. 继续循环,重复 c 中描述的过程,如下。

接"bigger 左移一位:"因为当前的arr[sp]<=主元(1<4)成立,所以 sp 右移一位即 sp++;

此时arr[sp]<=主元(6>4)不成立,所以交换 arr[sp]和 arr[bigger],再将 bigger 左移一位,如下图所示。

数据交换前:

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小黄人的哆啦梦

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

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

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

打赏作者

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

抵扣说明:

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

余额充值