基础能力决定你到底能走多远。我们不是写一两年程序就完事了,从毕业算起,我们可能要写20-30年的程序,这段漫长的长跑路程中,最终比的不是谁熟悉API比较多,也不是谁用插件用的有多熟练,更不是比谁更熟悉某软件,而是比谁的基础能力强,比谁的算法效率高,比谁对底层原理更加熟知于心,比谁能够解决更复杂的系统和需求。
最坏情况为O(n^2),平均性能比较好,其排序期望运行时间为 O(nlogn) 且 O(nlogn)记号中隐含的常数因子很小,另外还不消耗额外的内存空间,在嵌入式虚存环境中也能很好工作,因此广受人们欢迎,是最常用、最好用、用的最多的排序算法。
简单来说就是选取一个区域里的数字,把这个区域按这个数字分成两半,一半小一半大,然后继续对这两半做同样的操作,直到所有筛选都完成就完成了排序。
由完全二叉树结构支撑。普通的堆排序比快速排序更低效一点,但堆排序中的最大最小堆的优先级队列异常用有,即只关注最大或最小值,在不断增加和删除根节点元素的情况下获取最大或最小值。
最大最小堆排序常常用于A星算法。
可以用一维数组表示,这样则会让效率更加高一些因为内存是连续的。
索引对应规则:
父节点 i => 左子节点 i*2+1 右子节点 i*2+2
子节点 i => 父节点 (i-1) /2
插入一个元素:新元素被加入到heap的末尾,然后更新树以恢复堆的次序。
堆中每次都删除第0个数据。为了便于重建堆,实际的操作是将最后一个数据的值赋给根结点,然后再从根结点开始进行一次从上向下的调整。
桶排序,把所有的元素按一定大小范围分成N个组,对每个组进行快速排序,最终得到有序的数组,并且得到N个桶的记录,虽然第一次排序的速度不怎么样,但这N个桶的信息记录下来后对于后面的程序逻辑有非常大的帮助。比如模糊排序或模糊搜索。
基数排序,是针对元素的特性来实时的‘分配式排序’,利用数字的特性按个位数,十位数,百位数的性质放入0-9的桶中不用排序,几次合并后就有了有序数组,利用元素特性排序的速度比任何其他排序方式都要快速。