随笔分类 - 算法
摘要:1.栈有两种实现方式:链表和可变化大小的数组 链表优点:每次push和pop得时间是一定的,总的操作时间比数组大; 数组优点:在扩张/压缩数组的插入/删除花费时间大,但均摊下来每次插入和删除都比链表快速,显得总的操作时间小。 Q:何时采用链表方法? A:飞机场停飞机,网络中源源不断收到数据包。 因为
阅读全文
摘要:2018年8月30日补充: 看了普林斯顿算法中关于堆的实现,感觉更加形象生动,补充如下: 堆排序是我们所知的唯一能够同时最优地利用空间和时间的方法 在最坏的情况下也能保证使用2NlgN次比较和恒定的额外空间。 复杂度分析:O(nlogn):第一个for循环,初始化堆,为O(n),第二个for循环为O
阅读全文
摘要:直接选择排序和直接插入排序类似,都将数据分为有序区和无序区,所不同的是直接播放排序是将无序区的第一个元素直接插入到有序区以形成一个更大的有序区,而直接选择排序是从无序区选一个最小的元素直接放到有序区的最后。 设数组为a[0…n-1]。 1. 初始时,数组全为无序区为a[0..n-1]。令i=0 2.
阅读全文
摘要:该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔排
阅读全文
摘要:来源于《数据结构与算法分析:C语言描述》 def1:如果存在正常数c和n0,使得当N>=n0时,T(N)<=cf(N),则记为T(N) = O(f(N)); T(N)的增长率小于等于f(N)的增长率 def2:如果存在正常数c和n0,使得当N>=n0时,T(N)>=cg(N),则记为T(N) = Ω
阅读全文
摘要:8月28日看了MIT算法的归并排序 对“并”进行代码优化 优化归并排序: 一、考虑为何归并排序不适合特别小的数组? 因为申请额外空间,还会增加调用函数开销。而和插入排序比较而言,由于数组规模特别小,时间上并无太大差别。 因此改进方法就是进行切分。对于小于某个数组规模的数组进行插入排序。见代码 二、假
阅读全文
摘要:挖坑填数法+分治法(从别人的博客借鉴得到) 复杂度:O(nlogn)。 T(n) = 2T(n/2) + θ(n) (递归加一次遍历) 有主定理(见另外一篇随笔)得:O(nlogn)。 稳定性:不稳定,原因如下: 举个例子:待排序数组:int a[] ={1, 2, 2, 3, 4, 5, 6};
阅读全文
摘要:复杂度:因为两层for循环嵌套,故为O(n^2); 稳定性:稳定。因为a[j]>tmp,即只有比tmp大的才往后移动,和他相等并不往后移动。
阅读全文
摘要://冒泡排序1 最普通 //冒泡排序2 设置标志位 复杂度计算: 因为由两个for循环嵌套而得,故为O(n^2); 稳定性:稳定。因为当相邻两个数相等时,并不交换顺序,故二者前后顺序不变。 //冒泡排序3 假设a[100],仅前10个无序,后90个已经排好序,则只需要冒泡前10个//需要我们记录好位
阅读全文