• 《Unity3D高级编程之进阶主程》第一章 C#要点技术(五) 排序算法


            基础能力决定你到底能走多远。我们不是写一两年程序就完事了,从毕业算起,我们可能要写20-30年的程序,这段漫长的长跑路程中,最终比的不是谁熟悉API比较多,也不是谁用插件用的有多熟练,更不是比谁更熟悉某软件,而是比谁的基础能力强,比谁的算法效率高,比谁对底层原理更加熟知于心,比谁能够解决更复杂的系统和需求。

     快速排序算法

            最坏情况为O(n^2),平均性能比较好,其排序期望运行时间为 O(nlogn) 且 O(nlogn)记号中隐含的常数因子很小,另外还不消耗额外的内存空间,在嵌入式虚存环境中也能很好工作,因此广受人们欢迎,是最常用、最好用、用的最多的排序算法。

    排序步骤

    1. 从序列中选一个元素作为基准元素
    2. 把所有比基准元素小的元素移到基准元素的左边,把基准元素大的移到右边。
    3. 对分开来的二个一大一小的区块进行递归再筛选,对两个区块同样进行1、2的两个步骤处理。

            简单来说就是选取一个区域里的数字,把这个区域按这个数字分成两半,一半小一半大,然后继续对这两半做同样的操作,直到所有筛选都完成就完成了排序。

    优化

    1. 随机选择中轴数:随机也时常会选到坏的基准元素,实际上随机数并没有对排序提供多大的帮助。
    2. 三数取中:先选择头、中点、尾,三个数字先来次排序,把最小的放在头,中间的放在中,最大的放在尾。
    3. 小区间使用插入排序:在排序中,当切分的区块小于等于8个时,就采用插入排序来替代快速排序。
    4. 缩小分割范围,与中轴数相同的合并在一起:每次在分割比较中,当元素与中轴数相等时则直接移动到中轴数身边,移动完毕后划分范围从中轴数变为最边上的相同元素的位置。

    堆排序

            由完全二叉树结构支撑。普通的堆排序比快速排序更低效一点,但堆排序中的最大最小堆的优先级队列异常用有,即只关注最大或最小值,在不断增加和删除根节点元素的情况下获取最大或最小值。

            最大最小堆排序常常用于A星算法。

            可以用一维数组表示,这样则会让效率更加高一些因为内存是连续的。

            索引对应规则:

            父节点 => 左子节点 i*2+1 右子节点 i*2+2

            子节点 => 父节点 (i-1) /2

    插入

            插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序。

    删除

            堆中每次都删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。

    其他排序算法简要概括

            桶排序,把所有的元素按一定大小范围分成N个组,对每个组进行快速排序,最终得到有序的数组,并且得到N个桶的记录,虽然第一次排序的速度不怎么样,但这N个桶的信息记录下来后对于后面的程序逻辑有非常大的帮助。比如模糊排序或模糊搜索。

            基数排序,是针对元素的特性来实时的‘分配式排序’,利用数字的特性按个位数,十位数,百位数的性质放入0-9的桶中不用排序,几次合并后就有了有序数组,利用元素特性排序的速度比任何其他排序方式都要快速。

  • 相关阅读:
    qt6 多媒体开发代码分析(一)
    angular中多层嵌套结构的表单如何处理回显问题
    70.C++虚析构函数
    ESP8266-Arduino编程实例-TLV493D磁传感器驱动
    4.交叉熵
    武汉便宜的ov通配符https证书
    京东二面:Redis为什么快?我说Redis是纯内存访问的,然后他对我笑了笑。。。。。。
    java计算机毕业设计基于ssm的品牌首饰售卖平台
    使用百度EasyDL实现厂区工人抽烟行为识别
    CS526 O2 Homework Assignment 2
  • 原文地址:https://blog.csdn.net/renxi0/article/details/139962219