摘要:
排序算法时间的下界决策树模型:比较排序可以被抽象地视为决策树最坏情况下界:在决策树中, 从根到任意一个可达叶结点之间最长路径的长度,表示对应的排序算法中最坏情况下的比较次数。任意一个比较排序算法在最坏情况下,都需要做Ω(nlgn)次的比较堆排序和合并排序都是渐近最优的比较排序算法 阅读全文
摘要:
快速排序对包含n个数的输入数组,最坏情况运行时间为Θ(n2), 但快速排序通常是用于排序的最佳的实用选择,这是因为其平均性能相当好:期望的运行时间为Θ(nlgn), 且Θ(nlgn)记号中隐含的常数因子很小,另外它还能进行就地排序。伪码:QUICKSORT(A, p, r) if p < r then q ← PARTITION(A, p, r) QUICKSORT(A, p, q - 1) QUICKSORT(A, q + 1, r)数组划分:PARTITION(A, p, r) x ← A[r] i ← p - 1 for j ← p to r - 1 ... 阅读全文
摘要:
优先级队列是一种用来维护一组元素构成的集合S的数据结构,这一组元素中的每一个都有一个关键字key。一个最大优先级队列支持以下操作:INSERT(S, x): 把元素x插入集合SMAXIMUM(S): 返回S中具有最大关键字的元素EXTRACT-MAX(S): 去掉并返回S中得具有最大关键字的元素INCREASE-KEY(S, x, k): 将元素x的关键字的值增加到k,这里k值不能小于x的原关键字的值HEAP-MAXIMUM(A) return A[1]HEAP-EXTRACT-MAX(A) if heap-size[A] < 1 then error "heap underf 阅读全文
摘要:
堆排序的运行时间为Θ(nlgn),它是一种原地排序算法:在任何时候,数组中只有常数个元素存储在输入数组以外;对数据结构是一种数组对象,它可以被视为一棵完全二叉树。树中得每个结点与数组中存放该结点值的那个元素对应。树的每一层都是填满的,最后一层可能除外,表示堆的数组A是一个具有两个属性的对象:length[A]是数组中的元素个数,heap-size[A]是存放A中的堆元素个数。给定某个结点的下标 i , 其父结点PARENT(i),左儿子LEFT(i)和右儿子RIGHT(i)的下标可以计算出来:PARENT(i) return i/2LEFT(i) return 2 * iRIGHT(i) .. 阅读全文
摘要:
伪码:BUBBLESORT(A) for i ← 1 to length[A] do for j ← length[A] downto i + 1 do if A[j] < A[j - 1] then exchange A[j] ↔ A[j - 1]Java 实现 public void bubbleSort(int[] a) { int len = a.length; for (int i = 0; i < len; i++) { for (int j = len - 1; j > i... 阅读全文