《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的桶中不用排序,几次合并后就有了有序数组,利用元素特性排序的速度比任何其他排序方式都要快速。

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值