zoukankan      html  css  js  c++  java
  • 快排

    今天看算法题的时候遇到“找出数组中出现次数超过数组长度一般的数字”,需要用到快速排序,然而,又忘记了......

    赶紧一点点回顾起来:(以后记得动手写代码,反复练习)

     快速排序:重点是求出基准记录所在的位置,效率O(N*logN)

    http://blog.csdn.net/morewindows/article/details/6684558(参考了下这个博主的讲解,通俗易懂,更容易记住)

    思想如下:

    找到基准记录,以它为参考,一次排序之后,它的左边是比它小的数字,它的右边是比它大的数字。递归对左右的分别继续快排。

    过程如下:(参考博文里边将它总结为“挖坑填数+分治算法”)

    i,j,base

    i:左边指针(向右移动,找比base大的数)i=Left

    j:右边指针(向左移动,找比base小的数)j=Right

    base:选择的基准数的值

    1:i =L; j = R; 将基准数挖出形成第一个坑a[i];

    2:j--由后向前找比base小的数,找到 挖出此数填  上一个坑  a[i],同时得到了新坑 a[j],否则继续j--;

    3:i++由前向后找比base大的数,找到  挖出此数填 上一个坑 a[j],同时得到了新坑a[i],否则继续i--;

    4:重复2,3步,直到i==j,将base填入a[i/j];

    至此,原数组就在i/j处被分成两个子数组,i左边的都小于a[i],右边的都大于a[i]

     Note:快排的随机化版本与普通选择第一个数作为base的区别在于:只要将得到的随机数上的值和原数列第一个数交换即可。(当然涉及效率问题,之后研究)

    代码如下:

  • 相关阅读:
    捡到一本<C++ Reference>
    题目1008:最短路径问题
    题目1014:排名
    题目1080:进制转换
    题目1081:递推数列
    题目1086:最小花费
    题目1076:N的阶乘
    题目1035:找出直系亲属
    在Mac上搭建Jenkins环境
    获取鼠标点击UGUI,先对于特定物体的相对坐标
  • 原文地址:https://www.cnblogs.com/newcoder/p/5574784.html
Copyright © 2011-2022 走看看