范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

一篇文章理解快排

  一 前言
  算法对于程序员来说,是一个不得不去过的门槛,除了面试,工作中用到的机会却很少,偶尔用到的算法都有封装好的库调用下,就可以了,少有机会去写一个,偶尔有机会写个和算法相关的函数,可能心中也有几分忐忑,没有充分测试,总是怀疑其中隐藏什么大bug,在不该爆发的场合突然爆发,留下的一地的尴尬。
  更可气的是,算法学起来的时候看起来都明白了,很简单嘛,真正动手去写的时候,却很难写出无bug的哪怕是简单的算法代码来,说起来还是没有深刻的理解,在一些细节上总是模糊不清,似是而非。所以学习算法这件事情来说,关键是要理解深刻的背后思想,不能是简单地过一遍,而是学一分就深刻理解一分,一分不理解就不要看其他的,揉碎了融入自己的思想里面,变成自己的内功,才算有收获。 二 为什么是快速排序
  首先的问题是为什么要排序,除了一些我们想知道排名的场合,比如高考排名等?如果不是这些场合是不是就不要排序了,排序是计算机里面的最基本需求,排序的目的想想还是挺多的,比如我们需要知道Top K值,比如我们需要取一个城市工资的中位数,这个数值比所谓的平均值要靠谱的多,还比如有了排序,就可以做范围查询,有了排序就可以二分查找法,快速查到要搜索的数据,40亿的排序数据查找一个数,只需要最多32次,简直称得上魔法。
  那为什么是快速排序那,其实也没啥特别的,就觉得快排的思想挺有意思的,二是性能也很优秀,时间复杂度为O(nlogn), 如果面试偶尔让现场手写个快排代码,也不至于没有啥准备。
  虽然快排也有很多种实现,这篇是介绍的最简单的实现,没做什么优化,虽然不是最有用的,但是因为最简单,所以容易理解深刻,也容易写,也记得住。 三 快速排序3.1 快排具体过程
  总体来说,快排就三步: 从数组中选择一个基准值; 以这个基准值为界,将大于这个基准值的数放在基准值的右边,将小于基准值的数放在基准值的左边; 对左右两个区间递归秩序是第一步和第二步。 3.1.1 基准分区
  第一步和第三步都比较简单,关键是第二步,按照步骤说明下:
  说明: 1) 对上述的数组选择一个基准值,最简单的办法选择第一个元素作为基准值,赋值给tmp。 选择基准值后,第一个元素相当于空出来了。
  比较
  说明:我们设置两个指针(其实这里面是下标),分别指向数组的头部和尾部,从尾部开始判断array[j]是不是大于基准值, 因为1<6,所以需要将array[i] = array[j] ,因为比基准值小,所以要移动到前面去,且把i指针向后移动一位,因为i指针原来值的位置已经被填了值,即是处理过了。
  说明: 我们判断i处的值是否小于基准值,小于则继续对后移动,一直移动到了array[i] == 9的位置,这时候条件不满足了。
  说明:因为array[i] > 基准值6,则需要将array[j] = array[i], 即将i索引处的值9 赋值到j索引指向的位置。
  填上基准值
  说明: i==j了,说明本轮结束了,将基准值回填,这样经过了一轮的比较,我们就得到了第一个元组的正确位置,通过6将整个集合分成了两个部分,一个是左边的子集,全部小于6,一个是右边的子集全部大于6,如下:
  3.1.2 两个子集再递归
  通过上图我们得到了 左边子集 + 基准元组+ 右边子集,然后我们分别对左边子集再执行类似的操作,右边子集再进行类似的操作,就完成了整个数组的排序。
  左边子集的元素范围是 【 开始索引,i-1】 右边子集的范围是【i+1,结尾索引】 3.1.3 转成实际代码// 分区 int partion(int a[], int l, int r) {   int tmp = a[l];   while (l < r) {     // 从后对前判断元素是否大于基准值,大于则r 指针对前移动     while (a[r] > tmp && l < r) {       r--;     }     // 小于则赋值给首个元素,即将值移动到前面    // 如果l==r 则相当于a[0] = a[0] 无影响     a[l] = a[r];    // 从前对后判断是否小于基准值,小于等于对后移动     while (a[l] <= tmp && l < r) {       l++;     }     // 将值移动到后面     a[r] = a[l];   }   a[r] = tmp;   return r; }   void qsort(int a[], int left, int right) {   if (left < right) {     int mid = partion(a, left, right);     // 对前面的子集进行排序     qsort(a, left, mid - 1);    // 对右边的子集进行排序     qsort(a, mid + 1, right);   } }
  虽然代码没做任何其他优化,好处是便于理解也足够简单。 3.2 快排的时间复杂度
  复杂度重点在于按照基准值的分区,其他的只是递归计算而已,因为分区的时候我们用的两个指针的技术条件是i == j,扫描了整个数组空间,所以分区函数的时间复杂度是O(n),所以总的时间复杂度为: O(n) = n + T(L) + T(R) 然后T(L)和T(R) 又可以做递归分解,我们按照树的形式将时间分解如下:
  如上图所示,整个算法的耗时,就是每层耗时,而每层耗时的时间即是分区函数的时间:
  第一层: n个元素,分区所占时间为n;
  第二层:L子集分区时间为L,R子集分区时间为R,那第二层整体的分区所占时间为L+R,而L+R = n- 1 所以第二层耗时看作是n-1.
  第三层:LL +LR+RL+RR = L-1+R -1 即n-3, 依次类推: O(n) = n + n-1 + n-3 + ....看这个是不是等差数列,不,别上当,再计算一层看看:
  第四层:LLL+ LLR+LRL+LRR +RLL+RLR+RRL+RRR = LL -1 + LR -1 + RL-1 +RR -1 = (LL+LR)-2 + (RL+RR)-2 = L -1 -2 + R-1 -2 = L+R -6 = n - 7 看到了吧,这种树如果是完全二叉树,每层耗时递减得很快,完全二叉树的数量: 2的h次方(h为树高度)减去1,指数级别的增加;
  完全二叉树的高度最低为log2n ,n为节点数,按照刚刚每次计算的耗时,如果n很大,每层接近耗时为n,则总耗时为树的高度* 每层耗时 = n log2n,即时间复杂度为O(nlog2n)这是最好的情况,如果特殊情况,本身是倒序的,那么树就变成链表,就是n n最坏的时间复杂度为O(n^2)。 四 应用和优化4.1 快排找第k大元素
  快速排序算法除了可以排序外,还可以方便找第k大的元素,因为我们每次快排都找到了第一个元组的正确位置index,如果我们要找的第k大元素的k 小于index,那么我们就在小于基准值的集合里面去继续找第k大元素,如果第k大元素大于index,那么第k大元素在大于基准值的集合去找,但是不是找第k元素了,而是找第k-index的元素,这样每次我们都能过滤掉一个集合,性能显然很快。 4.2 优化快排
  单边递归优化  分区后,继续对左右两边排序,我们可以把一边在本轮直接处理了,所以叫单边优化: quick_sort(arr, l, x - 1); // 对左子集排序 quick_sort(arr, x + 1 , r); // 对右子集排序
  可以做成: void quick_sort(int *arr, int l, int r) {     while (l < r) {         // 分区         int ind = partition(arr, l, r);         // 对大于基准值的右子集正常调用递归函数          quick_sort(arr, ind + 1, r);         // 用本层处理左侧的排序         r = ind - 1;     }     return ; }
  减少了递归的层次,提升了性能。
  三点取中法  如果基准值选择得好,那么整个递归排序展开就是完全二叉树,性能最好,所以基准值选择很重要,有种优化是选择开头元素,结束元素,中间元素三个元素中,中间那个,当然上面的代码就不适用了,很大程度上避免选择基准值的问题。
  分区函数优化  分区的时候我们每次只是将其中i处和j处的值其中一个赋值给另外一个,如果我们只要满足条件就做移动,直到i和j都不满足的时候,交换两者的值,减少赋值过程,这样性能更快。

拼多多砍价到小数点后6位还是失败是真还是假拼多多砍价到小数点后6位依旧失败看见拼夕夕就觉得恶心,里面好多通知都是强行的,比如每次买东西,物流每更新一次,它就提醒一次,并且不可以关,真是恶心它妈妈遇到他爸爸,然后恶心到家。还Web3。0,并不仅仅只是一个入口文孟永辉简单地按照横向的逻辑来看待Web3。0,并不能够真正理解Web3。0的内涵,甚至还将会把Web3。0带入到类似Web1。0和Web2。0的发展境地里。然而,这种倾向却是现在断供打开潘多拉魔盒!反制措施出炉,科技秩序或将迎来重建潘多拉魔盒自今年2月以来,包括微软谷歌英特尔英伟达AMD甲骨文三星高通苹果在内的企业纷纷选择停止在俄业务,断供这一威力和破坏巨大的手段再次被使用。无论是芯片数据库还是智能手机,对于小米平板5pro上手照通过最终的筛选和纠结,还是选择了同品牌的小米平板,小米5pro整体上手来说,感觉不算太重的同时又感觉重。两个手拿着边框很割手(金属边框,塑料背板)我买的是6128G内存基本款(看好新能源汽车公共充电桩是快充还是慢充新能源汽车公共充电桩是快充,快充和慢充最大的区别在于快充是直流充电桩充电接口,把电网的交流电转化成直流电,输送到电动汽车的快充口,电能直接进入电池充电。慢充是交流充电桩充电接口,把理想L9阿维塔11护卫舰07北京车展值得关注的新能源车前瞻虽然最近这波疫情肆虐,让今年4月份的北京车展能不能如期举办充满了变数,但并不妨碍我们对这个上半年最重要的汽车展会充满期待。毕竟,从目前已知的消息来看,这次北京车展将有非常多的重磅车如果手机出现4种情况,建议直接换新,3个细节教你挑选耐用机型随着国产手机技术的不断提高,国人的换机周期也在变长。很多用户也遇到一个纠结的情况,手机用着用着总觉得不顺手,想要换掉,又觉得还能用不要浪费不换掉吧,自己用着又感觉不太舒服。今天想告入职字节跳动的第一天这城市只有我一个人?10年前,字节跳动的Day1从知春路上的一间民居开始10年后,每天都有亿万用户通过字节跳动的各个产品激发创造,分享美好。如今,Day1已经不再是某个具体的日子,而是一种不守成不自满特斯拉车顶维权女主AB面僵持争议与一连串官司作者李想来源产业科技时隔数月,特斯拉与上海车展维权女主张女士的纠纷仍在僵持中。近日,张女士在接受媒体采访时透露,她与特斯拉的数起案件有新进展,其中起诉特斯拉侵犯个人车辆数据纠纷一案比亚迪e9,外观帅气,空间宽裕,内饰设计柔美,配纯电动222马力近几年随着汽车普及,中大型车已经成为办公人事商务出行的常备车。不少消费者最先想到的是驾驶体验较为舒适,其实除了较好的驾驶体验外,一些品牌车在颜值方面也下足了功夫。今天给大家介绍的是CentOS7宝塔面板MinIO安装部署服务开机启动安装minio服务下载minio,建议下载到usrlocalbin目录下,可全局访问wgethttpsdl。minio。ioserverminioreleaselinuxamd64
最值得期待安卓手机,不是小米12,不是华为Mate50近期,智能手机市场风云再起。一波安卓新机来袭,华为P50小米MIX4荣耀Magic3和iQOO8系列,各有特色,给用户带来了不少惊喜。步入9月,苹果发布重磅机型iPhone13系列华为Mate50Pro渲染图抽拉式一体环绕屏,搭载2颗14纳米麒麟芯华为Mate50系列究竟何时发布现在如同谜一般,荣耀Magic3的发布外界均认为是借用了原本属于华为Mate50的外壳,所以这么一来华为Mate50系列的发布就显得遥遥无期。不过有vivo正式官宣X70系列将于9月9日发布,外形拉风,配置豪华vivo9月是手机发布会热度最高的一个月,大大小小的品牌商加起来大概会有一巴掌,这不vivo已经正式官宣,9月9日发布X70系列,这次的宣传语为蔡司影像,品阅时光。关于vivoX7为什么不建议买混合动力汽车?主要的原因有四个不建议买混合动力车的主要原因有四个汽车价格昂贵安全性无法保障充电问题以及维修保养费用较高。在未来的汽车世界,新能源肯定是一个必然的发展趋势,而燃油车和新能源汽车的过渡产品混动汽车,比亚迪7月销量超五万辆破新能源乘用车月销纪录据官方数据显示,比亚迪乘用车7月全系销售56975辆,同比增长89。4,环比增长14。5其中,新能源汽车销量达50057辆,同比增长262。7,环比增长24。8,创比亚迪月销量新高解锁门禁黑科技,OPPO公布新专利,用无线耳机就能开门?无论是在小区学校写字楼等各个场所,我们都能看到有门禁的存在。门禁的出现和存在在一定程度上提高了安全度,保障了人身安全的同时,也避免了不必要的麻烦和问题出现。但在解锁门禁时,仍有相当热烈庆祝后海科技与金睿思齐达成合作近日,后海科技与金睿思齐达成合作,未来,双方将深度沟通,携手并进,在校园内等多个场景继续进行产品的研发与合作。为广大在校师生,推出更多产品体验优良,科技感强的校园跨时代产品。这次是小米平板5销量为何如此之好!亲自上手体验,这些体验不吐不快我自己用小米平板5Pro已经有一段时间了,在这么长的使用体验中,我个人最明显的感觉就是配合手机使用,小米平板5Pro的优势很明显,下面是我自己对小米平板5Pro的一些体验反馈,大家挺进shoppingmall,手机品牌就能躺赢吗?2010年9月26日,北京西单大悦城人头攒动,苹果在中国大陆的第三家直营店即将正式开业,排在队伍前面的几位果粉已经在门店等待了超过24小时。据了解,苹果西单大悦城店开业当天销售额就腾讯视频因为吃相差惹了众怒官媒腾讯视频漠视消费者腾讯视频前几天因为超前点播的事被点名了,上海市消保委在官方微信号发文腾讯视频在热播的电视剧扫黑风暴的超前点播搞捆绑销售,腾讯视频漠视消费者选择权。话说,互联网巨头腾讯也不差钱啊,为奇瑞大蚂蚁这款新能源汽车到底ampampquot有几把刷子ampampquot?随着国家政策的提倡和扶持,很多新能源汽车产品逐渐成为了我们日常出行的工具,奇瑞作为国产汽车中的佼佼者,自然在极力听从国家的政策,大力发展新能源汽车产品。经过长时间的努力,奇瑞新能源