搞定Java快速排序

举报
AlbertYang 发表于 2021/02/03 00:27:21 2021/02/03
【摘要】 点击蓝字关注我们 全文字数:   921 阅读时间:   3 分钟 一 简介? 快速排序(Quicksort),简称快排,是对冒泡排序的一种改进。 快速排序由C. A. R. Hoare在1960年提出。它的基本思想分治法:即通过一趟排...

640?wx_fmt=png

点击蓝字关注我们

全文字数:   921

阅读时间:   3 分钟

简介?

640?wx_fmt=png

快速排序(Quicksort),简称快排,是对冒泡排序的一种改进。

快速排序由C. A. R. Hoare在1960年提出。它的基本思想分治法:即通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以使用递归实现。

算法思想?

640?wx_fmt=png

快速排序算法的核心思想是分治法,先比大小,然后分区。下面我们通过生活中的一个例子来解释一下这个算法思想。假设一个房间中有六个人,排成了一队,他们的年纪分别是21,36,26,22,18,29。我们希望按照他们的年纪从小到达重新进行排列,快速排序的思想是,选一个人的年纪作为基准数,这里选21,然后让剩下的人分别和21比较,小于21的都站在他的左边,大于21的都站在他的右边,通过21把这些人分成了两部分,然后对这两部分重复上边的步骤,即选基准数比较,分成两部分,再重复。。。。。。

。。。

21

。。。

实现思路?

640?wx_fmt=png

挖坑填数:以上面年龄排序为例

1.将第一个数21作为基准数,从队伍中站出来,队伍就空出了一个位,即形成了一个坑。

36

26

22

18

29

    i->                                                              <-j

2.从后向前找比21小的或等于21年纪的人,找到后让这个人站到前一个空的位置,形成一个新的空位。

18

36

26

22

29

  i->                                                  <-j

3.接着由前向后找比21年纪大或者等于21的人,找到后再让这个人站到前一个空的位置,又形成一个新的空位。

18

26

22

36

29

                i->                                    <-j

4.重复步骤2和3,直达前后标志位置i和j相遇,把基准数21放到i和j相遇的位置。

18

21

26

22

36

29

5.把21两边的部分重复上边的排序步骤。

第一趟排序结果{1} 21 {  26 ,22,36,29}

第二趟排序 {1} 21 {      ,22  ,36,29}

                   1,21 { 22 }26 {36,29}

第三趟排序 1,21 ,22 ,26   {      ,29}

                    1,21 ,22 ,26  { 29 ,36}

最终结果:1,21 ,22 ,26  ,29 ,36

代码实现?

640?wx_fmt=png


   
  1. public class Sort {
  2. public static void main(String[] args) {
  3. int array[]={21,36,26,22,18,29};
  4. int start = 0;
  5. int end = array.length - 1;
  6. // 调用sort方法,排序
  7. sort(array, start, end);
  8. // 循环输出排序后的结果,看是否正确
  9. for (int i = 0; i < array.length; i++) {
  10. System.out.print(array[i]+"\t");
  11. }
  12. }
  13. public static void sort(int array[], int low, int high) {
  14. // start是list的第一位,end是list的最后一位,start和end都是数组的下标位置;
  15. int start = low;
  16. int end = high;
  17. // value作为基准值,取未排序的第一位作为基准值
  18. // 算法大体思路,就是拿value和剩下的数比较,排序,
  19. // value值前都比value小,value值后都比value大
  20. int value = array[low];
  21. while (end > start) {
  22. // 从后往前比较,找到小于等于value的值
  23. while (end > start && array[end] >= value) {
  24. end--;
  25. }
  26. if (array[end] <= value) {
  27. // 把找到的数放到前一个空位
  28. int keyStarts = array[start];
  29. array[start]=array[end];
  30. array[end]= keyStarts;
  31. }
  32. // 从前往后比较,找到大于等于value的值
  33. while (end > start && array[start] <= value){
  34. start++;
  35. }
  36. if (array[start] >= value) {
  37. // 同理把找到的数放到前一个空位
  38. int keyStarts = array[start];
  39. array[start]= array[end];
  40. array[end]= keyStarts;
  41. }
  42. //左边递归调用
  43. if (start > low){
  44. sort(array, low, start - 1);
  45. }
  46. //右边递归调用
  47. if (end < high){
  48. sort(array, end + 1, high);
  49. }
  50. }
  51. }
  52. }

文章来源: albertyang.blog.csdn.net,作者:Albert Yang,版权归原作者所有,如需转载,请联系作者。

原文链接:albertyang.blog.csdn.net/article/details/97719815

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。