美文网首页
转载:快排实现

转载:快排实现

作者: leenpong | 来源:发表于2018-08-26 21:16 被阅读0次

快速排序(Quicksort)

基本思想:(分治)

先从数列中取出一个数作为key值;

将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它的右边;

对左右两个小数列重复第二步,直至各区间只有1个数。

辅助理解:挖坑填数

初始时 i = 0; j = 9; key=72

由于已经将a[0]中的数保存到key中,可以理解成在数组a[0]上挖了个坑,可以将其它数据填充到这来。

从j开始向前找一个比key小的数。当j=8,符合条件,a[0] = a[8] ; i++ ;将a[8]挖出再填到上一个坑a[0]中。

这样一个坑a[0]就被搞定了,但又形成了一个新坑a[8],这怎么办了?简单,再找数字来填a[8]这个坑。

这次从i开始向后找一个大于key的数,当i=3,符合条件,a[8] = a[3] ; j-- ;将a[3]挖出再填到上一个坑中。

数组:72 - 6 - 57 - 88 - 60 - 42 - 83 - 73 - 48 - 85

      0  1  2    3    4    5    6    7    8    9

此时 i = 3; j = 7; key=72

再重复上面的步骤,先从后向前找,再从前向后找。

从j开始向前找,当j=5,符合条件,将a[5]挖出填到上一个坑中,a[3] = a[5]; i++;

从i开始向后找,当i=5时,由于i==j退出。

此时,i = j = 5,而a[5]刚好又是上次挖的坑,因此将key填入a[5]。

数组:48 - 6 - 57 - 88 - 60 - 42 - 83 - 73 - 88 - 85

      0  1  2    3    4    5    6    7    8    9

可以看出a[5]前面的数字都小于它,a[5]后面的数字都大于它。因此再对a[0…4]和a[6…9]这二个子区间重复上述步骤就可以了。

数组:48 - 6 - 57 - 42 - 60 - 72 - 83 - 73 - 88 - 85

      0  1  2    3    4    5    6    7    8    9

平均时间复杂度:O(N*logN)

代码实现:

key值的选取可以有多种形式,例如中间数或者随机数,分别会对算法的复杂度产生不同的影响。

转自链接:https://www.jianshu.com/p/ae97c3ceea8d

其中Collections中的排序算法sort就是调用Arrays.sort,里面就是用快拍实现的:

相关文章

  • 转载:快排实现

    快速排序(Quicksort) 基本思想:(分治) 先从数列中取出一个数作为key值; 将比这个数小的数全部放在它...

  • js实现快排

    function quick_sort(list, start, end) {if (start < end) {...

  • 快排递归实现

    基本思想:(分治) 先从数列中取出一个数作为key值;将比这个数小的数全部放在它的左边,大于或等于它的数全部放在它...

  • 快排Java实现

    1、快排的核心思想: 1、从无序的数组中找到一个枢轴元素M,将数组一分为二:如将数组的第一个元素设置为枢轴元素。2...

  • Go语言实现快排+随机快排

    快排算法是一种本地算法,(即不需要额外的内存空间,就地排序) 基本思想:从这个数列里找一个数作为基准点(支点)跟其...

  • 快排(快速排序),实现从小到大排序和从大到小排序

    实现快排的方法类 测试类

  • 快排的swift实现

    目前看到的最容易理解的快排实现方法(swift版本) 快排的时间复杂度是O(nlogn),空间复杂度是O(logn)

  • sort快排的实现

    快速排序的基本实现 快速排序算法是一种基于交换的高效的排序算法,它采用了分治法的思想:1、从数列中取出一个数作为基...

  • 快排算法-OC实现

    引自百度百科 快速排序由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分...

  • 快排c++实现

    ``` hello ``` int div_sub_arr(int arr[], int left, int ri...

网友评论

      本文标题:转载:快排实现

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