给定一个具有n行和n列的二维数组(矩阵),并对其行和列进行排序,对它进行排序的有效算法是什么?
例如:
输入
1 5 8
3 6 9
8 12 15
输出:
1 3 5 6 8 8 9 12 14 15
我想要一个能在最佳时间解决问题的伪代码。
答案 0 :(得分:1)
我想到的第一个想法是概括" Merge Two Sorted Arrays"算法。
这将是O(n^2)
算法。
另请在此处查看此解决方案:http://www.geeksforgeeks.org/merge-k-sorted-arrays/
更新时间:06:30 UTC
我想到的另一个想法是分别合并每两行,并递归地重复该过程,这将是一个O(n.log(n))
算法。
答案 1 :(得分:1)
我认为在任何情况下都不应该超过O(n log(n)),因为这是我们在不考虑已排序的行和列的情况下快速排序的原因。
在合并排序中使用合并功能可能会得到一个很好的答案。称之为递归。但是它会再次给你O(n log(n))。虽然当它达到sqrt(n)的大小时,它将返回而不是一直到大小为1的问题。但仍然log(n sqrt(n))具有与n log(n)相同的增长顺序但是在实际中问题这可能会给你一个更好的结果。
编辑: 我假设我们合并行或列(没有任何区别)。
答案 2 :(得分:0)
请根据您所查找的语言编辑您的问题?
在python中:
>>> x = [[1, 5, 8, 10],
[3, 4, 5, 6],
[2, 3, 3, 9]]
>>> x = sorted([items for sub in x for items in sub])
>>> print x
[1, 2, 3, 3, 3, 4, 5, 5, 6, 8, 9, 10]
伪代码
创建一个空列表
循环遍历矩阵,
获得最小值,
将其附加到空列表
并从矩阵中删除该值。
答案 3 :(得分:0)
更改快速排序算法以1d访问您的2d数组。像这样:
之前:
sort(array){
...
for(i = 0; i<array.length; i++){
if(array[i]){
...
}
后:
sort(array){
...
for(i = 0; i < M * N; i++){
if(array[i/N][i%N]){
...
}