用于对2D阵列进行排序的算法

时间:2014-05-01 05:28:13

标签: sorting

给定一个具有n行和n列的二维数组(矩阵),并对其行和列进行排序,对它进行排序的有效算法是什么?

例如:

输入

1 5  8     
3 6  9      
8 12 15 

输出:

1 3 5 6 8 8 9 12 14 15

我想要一个能在最佳时间解决问题的伪代码。

4 个答案:

答案 0 :(得分:1)

我想到的第一个想法是概括" Merge Two Sorted Arrays"算法。

  • 维护n个指针,每个指针指向2D数组中的一行。
  • 每次迭代都会比较所有指针并选择最小值。
  • 将最小值推送到结果数组。
  • 推进该最小值行的指针。
  • 确保不要比较行长以外的指针。

这将是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]){
    ...
}