当前位置:   article > 正文

快速排序算法_直到遇到算法

直到遇到算法

人生当中成功只是一时的,失败却是主旋律。但是如何面对失败,却把人分成了不同的样子,有的人会被失败击垮,有的人能不断的爬起来继续向前...我想真正的成熟应该并不是追求完美,而是直面自己的缺憾,这才是生活的本质

目录

原理

图解

代码


原理

  • 从数组中挑选一个元素作为基准值(pivot).一般选第一个元素
  • 重新排序数组,将比基准值小的元素放到基准值前面,比基准值大的元素放到基准值后面,结束之后,这个基准值就在数组的中间位置,这个称谓分区操作.
  • 把基准值前面和后面的元素递归重复上面步骤.

 图解

 

 

代码

  1. <?php
  2. // 快速排序
  3. function quickSort(&$arr, $left, $right){
  4. if($left>$right) return $arr;
  5. // 选择一个基准值,这里取得是第一个值
  6. $basic = $arr[$left];
  7. // $i表示左侧比基准值大的数位置
  8. $i = $left;
  9. // $r表示右侧比基准值小的数位置
  10. $r = $right;
  11. // 当左侧和右侧没有重叠就一直执行,当停止执行,说明已经重叠,把基准值放进去就可以
  12. while ($i<$r)
  13. {
  14. // 从数组最后开始比较,当比基准值大的时候就让下标-1,直到遇到比基准值小的.
  15. while($i<$r && $arr[$r]>=$basic) $r--;
  16. // 已经遇到比基准值小的,把这个数移动到左侧的空位置
  17. // $i 可以理解为左侧的空位
  18. $arr[$i] = $arr[$r];
  19. // 从数组开始比较,当比基准值小的时候就让下标+1,直到遇到比基准值大的.
  20. while($i<$r && $arr[$i]<$basic) $i++;
  21. // 此时$i下标就是左侧比基准值大的数的所在位置
  22. // $r 理解为右侧空位,把左侧的值放到右侧空位
  23. $arr[$r] = $arr[$i];
  24. }
  25. // 跳出循环,说明$i和$r相等了,也就是下标在同一位置了,把基准值补充到当前位置.
  26. $arr[$i] = $basic;
  27. // 递归对基准值($i)左侧的数据进行重新排序
  28. quickSort($arr, $left, $i-1);
  29. // 递归对基准值($i)右侧的数据进行重新排序
  30. quickSort($arr, $i+1,$right);
  31. }
  32. function bubbleSort(&$arr)
  33. {
  34. $n = count($arr);
  35. for ($i = 0; $i < $n; $i++)
  36. {
  37. for ($a = 0; $a < $n-$i-1; $a++)
  38. {
  39. if($arr[$a]>$arr[$a+1])
  40. {
  41. $tmp = $arr[$a];
  42. $arr[$a] = $arr[$a+1];
  43. $arr[$a+1] = $tmp;
  44. }
  45. }
  46. }
  47. }
  48. $arr = [10,2,0,3,5,45,89];
  49. for ($i = 0; $i<10000; $i++) {
  50. array_push($arr, mt_rand(20,100000));
  51. }
  52. $startTime = microtime(true);
  53. // 1W条数据下,快速排序大约在0.02S左右,可以看出在数据量大的情况下差距还是非常大的
  54. // 快速排序
  55. quickSort($arr, 0, count($arr)-1);
  56. // 1W条数据的情况下 冒泡排序大概是3S左右
  57. // 冒泡排序
  58. // bubbleSort($arr);
  59. $endTime = microtime(true);
  60. print_r($endTime-$startTime);
  61. print_r($arr);
  1. <?php
  2. // 同样也是快速排序,写法不同
  3. function quickSort($arr)
  4. {
  5. if(count($arr)<=1) return $arr;
  6. $basic = $arr[0];
  7. $left = [];
  8. $right = [];
  9. for($i=1; $i<count($arr); $i++)
  10. {
  11. if($arr[$i] >= $basic) $right[] = $arr[$i];
  12. if($arr[$i] < $basic) $left[] = $arr[$i];
  13. }
  14. $leftArr = quickSort($left);
  15. $rightArr = quickSort($right);
  16. return array_merge($left, array($basic), $right);
  17. }
  1. # Python
  2. def quicksort(arr, left, right):
  3. # 下面解释是针对当 left=right时,执行过程
  4. # 当左面和右面下标重叠时,继续执行
  5. if left > right:
  6. return
  7. l = left
  8. r = right
  9. basic = arr[left]
  10. # 当执行到这里,如果l<r不成立,那么说明l=r了,因为上面条件是left>right,也就是left<=right,小于不成立,所以是等于.
  11. while l<r:
  12. while l<r and arr[r]>=basic:
  13. r-=1
  14. arr[l] = arr[r]
  15. while l<r and arr[l]<=basic:
  16. l+=1
  17. arr[r] = arr[l]
  18. # 当重叠了.直接把基准值赋值到当前数组中.
  19. arr[l] = basic
  20. quicksort(arr, left, l-1)
  21. quicksort(arr, l+1, right)
  22. if __name__ == '__main__':
  23. arr = [10,1,2,35,8,9]
  24. quicksort(arr,0,len(arr)-1)
  25. print(arr)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/947737
推荐阅读
相关标签
  

闽ICP备14008679号