美文网首页freeCodeCamp程序员今日看点
快速排序 - 容易中招的地方

快速排序 - 容易中招的地方

作者: holysu | 来源:发表于2017-02-24 16:48 被阅读254次

快速排序,也是一种二分的思想,选取一个基准数,然后将大于和小于基准的元素分别放置于基准数两边,然后继续按此方法分治基准数的两侧,直至最后一个元素。

那么快排的实现需要解决以下几个问题:

  1. 基准数的选择
  2. 元素的查找
  3. 递归调用
  4. 基准数的归位

对应处理:

  1. 通常选取头或者尾元素
  2. 一组一组的查找需要交换位置的元素
  3. 既然是递归,就一定要有终止递归的临界条件,要不然肯定会导致调用堆栈溢出
  4. 归位,查找相遇的位置和基准位元素互换

对于第二点,需要注意元素查找的先后顺序,以从小到大排序为例:

  • 如果 基准数选取的为arr[low] , 那么必须先从高位high查找到小于pivot的数,然后再从低位low寻找大于pivot的数,交换;
  • 如果 基准数选取的为arr[high] , 那么必须先从低位low查找到大于pivot的数,然后再从高位high寻找小于pivot的数,交换;

原因是, 当两侧的查找相遇时候,需要将基准数pivot 和相遇点元素的值交换以正确归位基准数pivot; 也就是pivot = arr[low] 这种情况 相遇点的元素值必须要小于pivot的值,如果先从低位low查找大于pivot的元素,最终停止的元素大于pivot的话 就会导致归位失败;

要更清晰的看具体的差别,可以交换下面代码中的 查找顺序,然后断点一步步查看差别; 其实我们写代码,思路有了,输入输出的条件限制清晰后代码实现可能只需要花20%的时间,还有80%的时间则花在一步步的验证边界情形上; 这边查找顺序的差别个人就断点调试了很多遍,也在纸上画出反例会出现的情况才得以印象深刻。

    /* 快速排序 */
    function quickSortUnit(arr,low,high){
        var temp,
            pivot = arr[high];
        while(low < high){      
            /* 查找顺序要和基准选取相反;
             pivot = arr[high] 则必须先从low开始;
             反之 pivot = arr[low]; 则必须先从high开始查找 */
            while(arr[low] <= pivot && low < high)
                low++; 
            arr[high] = arr[low];
            while(arr[high] >= pivot && low < high)
                high--;  
            arr[low] = arr[high];
        }
        // 校准,将基准移至正确位置
        arr[low] = pivot;
        return low;
    }

    function quickSort(arr,low,high){
         if(low >= high) return;
         var index = quickSortUnit(arr,low,high);
         quickSort(arr,low,index-1);
         quickSort(arr,index+1,high);
    }

附上一个网站 https://visualgo.net/sorting 可视化排序的过程

图片.png

相关文章

  • 快速排序 - 容易中招的地方

    快速排序,也是一种二分的思想,选取一个基准数,然后将大于和小于基准的元素分别放置于基准数两边,然后继续按此方法分治...

  • 2019-05-21

    关于算法图解 p52 快速排序,python写一下 把容易犯错的几个地方,用注释写出了。

  • 【算法-排序算法-归并排序】

    上篇文章说的是快速排序,这篇文章将归并排序。 归并排序和快速排序的思路有类似的地方,都是二分思想+递归调用的思路。...

  • C语言算法:快速排序-2020-08-24-周一

    简介 在排序算法中,快速排序可以说是知名度最高的,很容易就能遇到,晚上的文章也很多。C语言实现----快速排序 1...

  • 看动画学算法之:排序-快速排序

    简介 快速排序也采用的是分而制之的思想。那么快速排序和归并排序的区别在什么地方呢? 归并排序是将所有的元素拆分成一...

  • js 排序

    1.快速排序1(纯数字数组) 2.快速排序2(对象数组) 注意:这地方有个坑,只会调换排序的属性,其他属性不变。比如:

  • Java冒泡排序,快速排序理解与实现

    经典排序算法中,有好几种排序,下边说下冒泡排序和快速排序的理解与实现,记太多容易混乱; 1.冒泡排序:字面理解,值...

  • 七大排序算法之快速排序

    七大排序算法之快速排序 @(算法笔记)[排序算法, 快速排序, C++实现] [TOC] 快速排序的介绍: 快速排...

  • PHP 实现插入排序

    导语 关于排序的算法,就此告一段落。冒泡排序、快速排序、选择排序、加上本篇的插入排序,这四种算法都是相对简单,容易...

  • 快速排序的Python实现

    目录 快速排序的介绍 快速排序的Python实现 快速排序的介绍 快速排序(quick sort)的采用了分治的策...

网友评论

    本文标题:快速排序 - 容易中招的地方

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