美文网首页
先右j再左i --记快速排序里的一个大坑

先右j再左i --记快速排序里的一个大坑

作者: b6aed1af4328 | 来源:发表于2016-10-11 21:09 被阅读506次

快速排序用2个指针,左i右j,如果先左i循环,即

while(arr[i]<=temp&&i<j)
      i++;
while(arr[j]>=temp&&i<j)
     j--;

经由

if(i<j)
{ t=arr[i];
  arr[i]=arr[j];
  arr[j]=t;
}

左右交换,不断移除路上的绊脚石,终会达到i=j。此时i左边的数均小于temp,右边的数均大于temp。

但请注意,由于左i先行的缘故,此时arr[i]>temp

这意味着,之后arr[left]与arr[i]交换,把一个大于temp的数放到了第一位,要是此时i=2,岂不是把一个不是最小的数固定在了第一位!
而右j先行的话就不会,i=j时arr[i]是小于temp的。
还是先右j再左i的好。

相关文章

  • 先右j再左i --记快速排序里的一个大坑

    快速排序用2个指针,左i右j,如果先左i循环,即 经由 左右交换,不断移除路上的绊脚石,终会达到i=j。此时i左边...

  • 二叉树遍历

    前序遍历: 先根再左在右 中序遍历:先左再根再右 后续遍历 先左再右 再根节点

  • 排序-二叉树

    二叉树的排序可以分为中序排序 左 中 右前序排序 中 左 右后序排序 左 右 中 中序排序能够快速遍历出...

  • QuickSort GoOver 1

    QuickSort排序过程(正序,左往右,小到大): 原始 int 数组 p: i=0,j=9,k=p[i]=6(...

  • iOS面试几个基本算法

    1.【快速排序】 算法介绍:假设要排序的数组是A[0]……A[n-1] 1)设置两个变量i、j,排序开始的时候:i...

  • 快速排序之两路快排

    这里有一个非常重要的点,j必须先动,再i动,因为如果所有数都小于基准点时,若i先动将直接返回原数组,这时排序是错误...

  • 二叉树前序中序后序遍历

    二叉树遍历方法 前序遍历:根左右。先打印,再遍历左子树,再遍历右子树; 中序遍历:左根右。先遍历左子树,再打印,再...

  • 时间复杂度为O(nlogn)的算法

    mergeSort 口诀: 左拆分,左合并,右拆分,右合并,最后合并左右。 归并排序的逻辑 归并排序的战略(宏观)...

  • 前端常见算法

    1、冒泡排序 function sort(arr){ var i=j=0; for(i=1;i for(j=0;j...

  • vim 的操作

    vim 的操作 先做简单的记录H -> J -> K -> L 依次为 左 -> 下-> 上 -> 右 (当然...

网友评论

      本文标题:先右j再左i --记快速排序里的一个大坑

      本文链接:https://www.haomeiwen.com/subject/gtbbyttx.html