当前位置:   article > 正文

【JavaDS】排序——快速排序_对用户输入的杂乱无序的数字序列按照由小到大的顺序排序。要求分别运用合并排序和

对用户输入的杂乱无序的数字序列按照由小到大的顺序排序。要求分别运用合并排序和

概念

1. 在序列中选择一个元素(如何选择并不重要,记为 pivot),通过遍历的方式,比较给定        元素和区间内其他元素的大小关系

2. 在遍历期间,通过算法的设计,将序列排成如下图序列

        注意:<= pivot 和 >= pivot 区间内顺序无法保证

                   pivot 也很大可能不在中间

3. 此时认为 pivot 就处于序列有序后其应该在的位置,最后对左右两个区间分别排序

 

排序过程中的小细节

1. 如果区间内元素个数 <= 1,则不用做任何处理,因为天然有序

2. 从区间中(这个区间不代表整个数组,需要用 [from, to] 来限定)中挑选一个 pivot ,方式      随意

3. 遍历区间,将每个元素都和 pivot 进行比较,并且进行必要的位置移动,使得遍历完成          后,满足上图所示区间

    把这个处理区间的过程称为 partition

    注意:partition 的过程只是快速排序中的一个小步骤,并非全部过程 

4.大区间处理完成后,继续对两个小区间按照同样的方法进行处理(算法可使用递归)

具体的 partition 的方法

partitionMethodA

从 array[left] 开始与 pivot 进行比较,当出现 array[left] > pivot 时,left++ 停止,array[right] 再与 pivot 比较,出现array[right] < pivot 时,right-- 停止,随后交换array[left] 和 array[right] ,重复此操作直到 [left, right) 区间内没有元素了(即 left ==right),最后再将 array[to] 和array[left](或 array[right] )的值交换(即将 pivot 的值放在序列中间),至此第一次 partition 完成

 

 partitionMethodB

最开始 to == right 

取 array[to] = pivot ,从array[left++] 开始依此与 pivot 进行比较,若遇到 > pivot 的元素,将array[left] 赋值给array[right] ,随后再从array[right--] 开始与 pivot 比较,若遇到 < pivot 的元素 ,将array[right] 赋值给 array[left] ,重复此步骤直至 left == right , 再将 pivot 的值赋给array[left],至此第一次 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. right--;
  28. }
  29. array[right] = array[left];
  30. while (left < right && array[right] >= pivot) {
  31. left++;
  32. }
  33. array[left] = array[right];
  34. }
  35. array[left] = pivot;
  36. return left;
  37. }

 

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号