• 快速排序


    快速排序是在面试中经常问到的算法题,也比较难掌握,特别是没有经常写算法的人儿。

    算法思想

    用笔者所理解的话来说,其算法思想是利用分而治之的思想,每一趟都保证左边比基准小,右边比基准大,而且递归划分排序。

    一趟快速排序的算法是:

    1、设置两个变量i、j,排序开始的时候:i=0,j=N-1;

    2、以第一个数组元素作为基准数据,赋值给key,即key=A[0];

    3、从j开始向前搜索,即由后开始向前搜索(j减1),找到第一个小于key的值A[j],将A[j]和A[i]互换;

    4、从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]互换;

    5、重复第3、4步,直到i=j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

    举个例子:

    1、 对5,3,8,6,4这个无序序列进行快速排序,思路是右指针找比基准数小的,左指针找比基准数大的,然后交换之并更新基准位置。

    2、5,3,8,6,4 用5作为比较的基准,right往左找,4<5,找到了4,left往右找,8>5,找到了8,然后交换,然后变成了5,3,4,6,8,同时新的基准位置修改为left,也就是4的位置,交换后变成4, 3, 5, 6, 8,而新的基准位置就是5的位置了

    3、4,3,5,6,8 然后以5为基准划分成两个小组(4, 3)和(5, 6, 8),第一个小组和第二个小组分别进入到步骤1,最后形成(3,4)而(5,6,8)因为已经有序,所以整个过程就完成了。最终形成(3,4,5,6,8)

    上面留下来了一个问题为什么一定要j指针先动呢?首先这也不是绝对的,这取决于基准数的位置,因为在最后两个指针相遇的时候,要交换基准数到相遇的位置。一般选取第一个数作为基准数,那么就是在左边,所以最后相遇的数要和基准数交换,那么相遇的数一定要比基准数小。所以j指针先移动才能先找到比基准数小的数。

    时间复杂度

    快速排序是不稳定的,其时间平均时间复杂度是O ( nlgn )。

    伪代码

    C语言版

    Swift版

     

  • 相关阅读:
    skywalking源码改造
    skywalking包覆盖
    skywalking-拦截器实现(2)
    skywalking-拦截器实现(1)
    skywalking-过滤某些不需要被监控的接口
    扩展Spring-data-jpa导致注解@NamedEntityGraphs失效
    Skywalking日志收集功能使用:
    LRU缓存机制(基于LinkedHashMap)
    2020年总结
    Hbase简介
  • 原文地址:https://www.cnblogs.com/gongyuhonglou/p/10311578.html
Copyright © 2020-2023  润新知