快速排序

举报
香菜聊游戏 发表于 2021/07/15 02:04:50 2021/07/15
【摘要】 快速排序的思想:选第一个元素为标杆元素,大小分站两边,然后进行递归,直至不再可以分区 Q1:为什么先指向尾部+1? A:因为先--,为了防止错过最后一个元素,所以加1。 Q2:为什么和从尾部过来的 j 交换? A:只能和指向低半区的j交换,如果和高半区的 i 交换,则 i 去了低半区 和向标杆趋近的 j 交换   package com...


快速排序的思想:选第一个元素为标杆元素,大小分站两边,然后进行递归,直至不再可以分区

Q1:为什么先指向尾部+1?

A:因为先--,为了防止错过最后一个元素,所以加1。

Q2:为什么和从尾部过来的 j 交换?

A:只能和指向低半区的j交换,如果和高半区的 i 交换,则 i 去了低半区

和向标杆趋近的 j 交换

 


  
  1. package com;
  2. import static java.lang.System.out;
  3. public class QuickSort {
  4. //a为待排序的数组,s为开始索引,e为结束索引
  5. static int p(int[] a ,int s,int e){
  6. int temp;
  7. int i=s;
  8. int j =e+1;//因为先--,为了防止错过最后一个元素,所以加1。
  9. //将开头元素作为标杆
  10. int x = a[s];
  11. while(true){
  12. //找到第一个比标杆大的元素 ,大于停
  13. while(a[++i]<x&&i<e);
  14. //找到第一个比标杆小的元素 ,小于停
  15. while(a[--j]>x);
  16. //如果两个索引交叉,则结束循环
  17. //7,2,3,4,9,15,16,如果当前i,j指针指向4,9,
  18. //最后一次i,j 的位置分别指向9,4,j指向低区最后一个元素的位置,所以把标杆放在j位置
  19. //只能和指向低半区的j交换,如果和高半区的j交换,则9去了低半区
  20. if(i>=j){
  21. break;
  22. }
  23. temp = a[i];
  24. a[i]= a[j];
  25. a[j] = temp;
  26. }
  27. temp = a[j];
  28. a[j]= a[s];
  29. a[s]= temp;
  30. return j;
  31. }
  32. static void quick(int[] a ,int s,int e){
  33. if(s<e){
  34. int q = p(a,s,e);
  35. quick(a,s,q-1);
  36. quick(a,q+1,e);
  37. }
  38. }
  39. public static void main(String[] args) {
  40. int a[] ={1,8,2,5,4,7,6,3};
  41. quick(a,0,7);
  42. for(int i =0;i<8;i++){
  43. out.println(a[i]);
  44. }
  45. }
  46. }


 

文章来源: gamwatcher.blog.csdn.net,作者:香菜聊游戏,版权归原作者所有,如需转载,请联系作者。

原文链接:gamwatcher.blog.csdn.net/article/details/7463526

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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