快速排序源码理解:

源码:

  1. public static int getMiddle(int[] list, int low, int high) {
  2. int tmp = list[low]; // 数组的第一个值作为中轴(分界点或关键数据)
  3. while (low < high) {
  4. while (low < high && list[high] > tmp) {
  5. high--;
  6. }
  7.  // 比中轴小的记录移到低端
  8. while (low < high && list[low] < tmp) {
  9. low++;
  10. }
  11. if(high<low){
  12. int temp=list[high];
  13. list[high] = list[low]; // 比中轴大的记录移到高端
  14. list[low]=temp;
  15. }
  16. }
  17. list[low] = tmp; // 中轴记录到尾
  18. return low; // 返回中轴的位置
  19. }
  20. public static void unckSort(int[] list,int low,int high) {
  21. if(low < high) {
  22. int middle = getMiddle(list,low,high); // 将list数组一分为二
  23. unckSort(list,low,middle-1); // 对低字表进行递归排序
  24. unckSort(list,middle+1,high); // 对高字表进行递归排序
  25. }
  26. }
  27. public static void quick(int[] str) {
  28. if(str.length > 0) {
  29. // 查看数组是否为空
  30. unckSort(str,0,str.length-1);
  31. }
  32. }
  33. int[] number={13,15,24,99,14,11,1,2,3};
  34. System.out.println("排序前:");
  35. for(int val:number) {
  36. System.out.print(val+" ");
  37. }
  38. quick(number);
  39. System.out.println("\n排序后:");
  40. for(int val:number) {
  41. System.out.print(val +" ");
  42. }
  43. 排序前:
    13 15 24 99 14 11 1 2 3
    排序后:
    1 2 3 11 13 14 15 24 99 
  44. 此上源代码转载C语言中文网
  45.    开始正文:
  46. 23行至26行从这里作为入口进行值的录入(顺便看是否为空数组;即长度为0的,元素为空),str ,0,str.length-1;分别代表着数组,这个数组第一个元素,这个数组的最后一个元素。
  47. 第2行把数组的第1个元素赋值到整型tmp中,拿tmp元素作为关键数据进行比对,然后通过While循环对数组进行遍历分析,他的循环条件是最后一个元素,大于第一个元素(及关键数据),其中又有两个while循环体我们先说第一个。他的循环条件有两个第一个条件是:最后一个元素,大于第一个元素。这与大循环条件一至,第二个循环条件是最后一个元素的值大于tmp的值,有人会问为什么不直接用low(数组第一个元素)进行比较,因为这个Low已经不是作为储存元素的数组了,他现在的作用是比较器。他是从头端,从前往后进行比较,而high作为末端,从末往前进行比较。直到他俩不满足第一层while循环条件时退出。
  48. 现在来讲,4至7行代码意思high大于tmp的值,那么他便前进一步即从最后一个变成了倒数第二个了high--嘛,从后往前进行遍历。8至9行代码意思是满足low元素若小于tmp元素,那吗low元素便逐渐从前往后遍历。直到遇到一种情况,也就是11行到14行的内容。high索引小于tmp,而low索引大于tmp则high和low这两个索引互换形成新的low索引和high索引。最后他们通过20行到25行递归的方法实现再底字端和高字段的的排序。
  49. 最后就得到了排序好的数组。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值