算法课2
推排序
优化(当数组初始有很多值):从后往前,每个元素下沉,时间复杂度为O(N)
优点:在空间复杂度为O(1)的情况下保证时间复杂度为O(nlogn)
前缀树
有点像哈夫曼编码,每个树节点有一个pass值和end值,pass记录经过这个节点的字符串的数量(包括以这个节点结尾),end记录以这个节点结束的字符串数量。如果一道题目有前缀查询的特点,可以用前缀树,并且在节点添加别的信息。
基数排序本质
将待排元素的维数分开,每个维度的重要性不同,再把每个维度的元素映射到数字上,每个维度用桶排序,维度排序从最不重要到最重要(重要的维度元素可以颠覆不重要维度已经排好的序列)。
桶排序实现
- 用count[10]数组统计个位为0...9的数字个数,用help[n]暂存
- count[10]计算前缀和,count[i]代个位为i的数字,自己+前边一共有几个数字,count[i]-1就是个位为i数字应该调整到的数组下标,help[count[i]-1] = a,然后count[i]--,因为再出现个位为i的数字,他的位置应该往前。
- 从右往左,把arr[i]用上述方法填到help中
- help拷贝回arr,排十位,回到第一步。
排序选择
| 时间 | 空间 | 稳定 | |
|---|---|---|---|
| 归并 | NlogN | N | yes |
| 快排 | NlogN(常数最小) | logN | no |
| 堆排 | NlogN | 1 | no |
判断链表有环
快慢指针,快的走两步,慢的走一步,两个指针相遇后,快指针回到起点,两个指针都每次走一步,最后会在入环处相遇。

浙公网安备 33010602011771号