JavaScript对快速排序算法的初步实现

       因为一次看到书中有提到快速排序算法,然而自己只是知道快速排序的实现原理是使用分治法,具体的原理和细节实现却不是特别的清楚。故而向认识的一位算法大师ACdreamers(吾以为。其博客地址:ACdreamers)求助,随后大师分享了我一篇他之前写过的博客。由此篇博客的学习,得以理解快速排序算法,该篇博客的具体地址如是:BFPRT算法在BFPRT算法中,强调的是对中位数取中位数,故它又叫中位数的中位数算法。

       通过该篇博客的学习,理解了快速排序的几个重要点:

       1、如何选取pivot值

        一般,都会选择首位值或者末尾值,因为这样取值相对很方便,传入的数组下标容易得到。其次,将所选首位值(假若是首位)先存放一个变量中不动,然后利用填坑原理,让首位值变成“坑”。

       2、如何扫描数组

       在进行一次Partion(一次快速排序)时,可以有两种方式对数组进行扫描比对。

              <1>双向扫描:是以所选的pivot为基准,两个指针从数组的首尾向中间扫描。尾指针遇到比pivot小与或等于的数值,与当前的“坑”进行交换,并产生新的“坑”。然后,首指针遇到比pivot大于或等于的数值,与当前的“坑”再进行交换。最后,将pivot的值赋值给最后一次主动要交换的数组位置。

              <2>单向扫描:是两个指针一前一后同时向前开始扫描指针,由于该方法的效率要低于双向扫描的方式,故而在此不做详细的描述。有兴趣的朋友,可以自行查看大师具体博客中的内容讲解和代码实现。

        3、关于要排序的长度

        由于快速排序可以应用到去解决Top K问题,因此再选择排序的时候,end(后面的具体代码实现中可以看到)的取值要注意。当end小于数组的length时,可以对前end+1个值排序;当end = length-1时,会对整个数组进行排序,但此时会在数组的末尾增加一位,其数值为undefined。当end >= length时,就会陷入死循环。

       具体的代码实现,如下:

     function quickSort(arr, start, end) {
        var i = start,
            j = end,
            pivot = arr[i];
        while (i < j){
            while (i < j && arr[j] >= pivot)  //找出比pivot小于等于的值
                j--;
            arr[i] = arr[j];
            while (i < j && arr[i] <= pivot)  //找出比pivot大于等于的值
                i++;
            arr[j] = arr[i];
        }
        arr[i] = pivot;
        if(start < end){
            quickSort(arr, start, i-1);  //左边迭代
            quickSort(arr, i+1, end);    //右边迭代
        }
     }
  

       暂时先理解了快速排序算法的一个基本实现,至于BFPRT算法(对快速排序算法的优化)之后在理解清楚之后再做具体的解释。当然,快速排序算法不止一种优化方法,还有其他的优化方法和思想值得去学习和借鉴。再唠叨几句(借此送给不断在变强的你我),在学习的路上,请保持专注,并且对知识保持一种饥渴感,促使自己不断去提升。当某一天突然回眸,你会很庆幸的发现,这个过程是多么的珍贵和难忘。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值