摘要:
问题描述假设n个记录中每个关键字都介于0到k-1之间,修改计数排序算法,使得算法满足:时间复杂度:O(n+k),空间复杂度:n+O(k)问题分析原计数排序算法中,需借助另一个大小为n的数组进行排序,不能做到原地排序,如何实现原地排序?原计数排序算法中,对数组中的每个元素,都已计算出了比其小或相等的元素个数,即确定了其最终位置。每个元素都已确定了自身的最终位置,但如何实现原地排序?解决思路从数组最后一个元素array[array.size()-1]开始,将其交换至最终位置上,并对交换后的array[array.size()-1]继续执行此操作,直至该元素的最终位置即为此位置为止,此后,对下一个位 阅读全文
摘要:
m*n的Young氏矩阵定义如下:m*n的矩阵每一行,每一列的数据有序∞表示不存在的元素如:2 3 5 124 8 14 ∞9 16 ∞ ∞∞ ∞ ∞ ∞1. 如何在O(m+n)时间复杂度的条件下实现删除最小元素,并使删除后的矩阵保持为Young氏矩阵?将矩阵类比成“二叉树”:某一元素下边的元素类比为该元素的左孩子,右边的元素类比为右孩子,则Young氏矩阵可看成一个小根堆。因此,可参考堆排序中的EXTRACT_MIN算法来实现。为表达方便,以A[i, j]表示以A[i, j]为左上角边界的矩阵,如A[1, 2]为: 3 5 12 8 14 ∞16 ∞ ∞∞ ∞ ∞首先... 阅读全文
摘要:
快速排序的伪代码如下:1 QUICKSORT(A, p, r)2 if p < r3 q <- PARTITION(A, p, r)4 QUICISORT(A, p, q-1)5 QUICKSORT(A, q + 1, r)可采用尾递归的方式减小堆栈的深度,即采用迭代控制结构替代第二次递归调用,尾递归在大多数的编译程序中都被采用。伪代码如下:1 QUICKSORT(A, p, r)2 while p < r3 q <- PARTITION(A, p, r)4 QUICISORT(A, p, q-1)... 阅读全文