当前位置:   article > 正文

JAVADS——快速排序_array和pivot,如果array == 0, output = 0,如果array和pivot

array和pivot,如果array == 0, output = 0,如果array和pivot同为正或负,output=1,

  快速排序具体是在序列中选择一个元素(如何选择没有规定),接下来通过"遍历的方式",比较所选定的元素和区间内其他元素的大小关系。
   快排
   1) 如果区间内的元素个数<=1,则不用做任何处理,因为天然有序
   2)从区间中(这里的区间不代表整个数组,所以需要通过[from,to]来限定)中挑选一个pivot,挑选方式随意
   3)遍历区间,将每个元素都和pivot进行比较,并且进行必要的位置移动,是的完成区间遍历之后,整个数组被分成三个小区间,【<= pivot】【pivot】【>=pivot】 整个过程一般称为partition。


   如图所示,所选定的pivot = 7,经过遍历比较之后,就被分成大于7和小于7 的两个区间,此时就变成两个小问题(问题性质一样,都是排序,但是数据规模在明显降低),在两个小区间继续进行上述操作
       
        partition的几种方式(所讨论的区间,很大可能是处于原始数组中间的一段区间,array中的[from,to] from不一定是0,虽然一开始是0,同理。to很大概率也不是array.length - 1,虽然一开始是array.length- 1)
        PartitionA:
        首先确定pivot,然后是 array[left] 与 pivot 进行比较,如果 array[left] < pivot,left就向右走一步,然后下一个值与pivot比较,直到array[left] > pivot,此时比较结束;同理array[right]与pivot比较,array[right] > pivot,array[right]向左走一步,直到array[rigth] < pivot 比较结束。此时交换array[left] 和 array[right],继续重复以上步骤直至 left == right,比较结束,交换 left 和 to,此时第一次partition结束

 PartitionB:

最开始 to ==  right ,array[to] = pivot 然后array[left]与pivot比较,array[left] <= pivot,left向右走,然后 array[right] = array[left];同理 array[right]与pivot比较,array[right] >= pivot,right向左走,接着array[left] = array[right],循环比较直到所有元素完成比较,一次partition完成。

代码如下:

  1. private static int partitionMethodA(long[] array, int from, int to) {
  2. long pivot = array[to];
  3. int left = from;
  4. int right = to;
  5. while (left < right) {
  6. while (left < right && array[left] <= pivot) {
  7. left++;
  8. }
  9. while (left < right && array[right] >= pivot) {
  10. right--;
  11. }
  12. long t = array[left];
  13. array[left] = array[right];
  14. array[right] = t;
  15. }
  16. long t = array[to];
  17. array[to] = array[left];
  18. array[left] = t;
  19. return left;
  20. }
  21. private static int partitionMethodB(long[] array, int from, int to) {
  22. long pivot = array[to];
  23. int left = from;
  24. int right = to;
  25. while (left < right) {
  26. while (left < right && array[left] <= pivot) {
  27. left++;
  28. }
  29. array[right] = array[left]; // 这里
  30. while (left < right && array[right] >= pivot) {
  31. right--;
  32. }
  33. array[left] = array[right]; // 这里
  34. }
  35. array[left] = pivot; // 这里
  36. return left;
  37. }


  

  
 

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

闽ICP备14008679号