算法课2

推排序

优化(当数组初始有很多值):从后往前,每个元素下沉,时间复杂度为O(N)

优点:在空间复杂度为O(1)的情况下保证时间复杂度为O(nlogn)

前缀树

有点像哈夫曼编码,每个树节点有一个pass值和end值,pass记录经过这个节点的字符串的数量(包括以这个节点结尾),end记录以这个节点结束的字符串数量。如果一道题目有前缀查询的特点,可以用前缀树,并且在节点添加别的信息。

基数排序本质

将待排元素的维数分开,每个维度的重要性不同,再把每个维度的元素映射到数字上,每个维度用桶排序,维度排序从最不重要到最重要(重要的维度元素可以颠覆不重要维度已经排好的序列)。

桶排序实现

  1. 用count[10]数组统计个位为0...9的数字个数,用help[n]暂存
  2. count[10]计算前缀和,count[i]代个位为i的数字,自己+前边一共有几个数字,count[i]-1就是个位为i数字应该调整到的数组下标,help[count[i]-1] = a,然后count[i]--,因为再出现个位为i的数字,他的位置应该往前。
  3. 从右往左,把arr[i]用上述方法填到help中
  4. help拷贝回arr,排十位,回到第一步。

排序选择

时间 空间 稳定
归并 NlogN N yes
快排 NlogN(常数最小) logN no
堆排 NlogN 1 no

判断链表有环

快慢指针,快的走两步,慢的走一步,两个指针相遇后,快指针回到起点,两个指针都每次走一步,最后会在入环处相遇。

posted @ 2022-02-18 14:46  hellozhangjz  阅读(17)  评论(0)    收藏  举报