js 数组快速排序算法

一, 序言(内容与代码无关)

之前看了一下百度百科的快速排序算法,所以现在就想写下加深点印象。代码在最下方,前面是我个人理解。

二, 看图说话

在这里插入图片描述
我这个图是在百度百科上拉取的,百度百科是动态的,我的不能动抱歉,要看原图地址的来这,我这里直接根据原始图片来讲解了。

2.1 快速排序

第一步: 在一个数组内确定一个基准值
第二步: 通过这基准值将数组分成左右俩个数组
第三步: 重复前两步就可以了。
要是不明白看下这个图片
每次排序的目的: 就是在每次排序的时候,把基准值都排到数组的“中间”(数据大小的中间),基准值的左侧都是比她的,基准值的右侧都是比她的值,按比较容易理解的想法就是,每次我们只是找出基准值正确位置

三,代码区

var arr = [101,5,199,95,97,97,100]; //需要处理的数组
function quickSort(arr,_begin,_end){
  var i=_begin;
  var j=_end;
  var key = arr[_begin]; //基准值(为了便于排序建议取第一个或最后一个,这里取数组第一个)
  if(i>= j){ //如果数组只有一个元素
      return;
  }
  while(i<j){ //开始值小于结束值时,数组数据一直进行对比
      while(i<j&&arr[j]>key){  //首先从后往前找,找出比基准值小的记下位置信息,
          j--;
      }
      while(i<j&&arr[i]<=key){ //接着从前往后找,找出比基准值大的记下位置信息,
          i++;
      }
      if(i<j){   //从上述对比的数据结果中,找出符合条件的数据位置进行调换,
          var temp=arr[i]; 
          arr[i] = arr[j];
          arr[j]= temp;
      }
  }
  这里我们那第一次排序结束为案例,(记住一点每次排序的目的)。
  // console.log( "原数组位置未发生变化,但第一次排序已经结束,此时 i==j",arr,i,j)
  arr[_begin] = arr[i];   //原数组中间位置数据放在原基准值位置,(j,i)
  // console.log( "原数组中间位置数据与基准值位置对调",arr,i,j)
  arr[i] = key;   //将原基准值放在新数组的中间,区分出左右两组数据,左边小于基准值,右边大于基准值。
  // console.log( "得出第一次排序的最终数组",arr,i,j)
  // debugger //这里打的debugger为了方便我们看每进行一次排序后数组的结果
  上述只是找出了一个基准值的位置,并且将数组由基准值值位置分成了两个小数组
  quickSort(arr,_begin,i-1);  //左侧的数组进行上述操作,
  quickSort(arr,i+1,_end);	//左侧数组排序完后,右侧数组重复上述操作。
   return arr;
}
quickSort(arr,0,arr.length-1)
console.log(arr)

四, 总计

这次的文章主要还是根据百度百科,里面还包含了许多其他语言的快排方法,觉得百度百科牛人还真是多啊!加油!!!。
参考地址:https://baike.baidu.com/item/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/369842?fromtitle=%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F&fromid=2084344&fr=aladdin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值