O(n)时间内的双维数组排序

时间:2012-05-04 19:51:13

标签: c arrays complexity-theory array-algorithms

我在面试中被问了一个问题,就是在O(n)时间内对双维数组进行排序。如何在O(n)中进行。可以有人对它进行一些说明..谢谢。

输入:

3 5 7 1
4 9 2 0
9 3 6 2   

输出

0 1 2 2 
3 3 4 5  
6 7 9 9

2 个答案:

答案 0 :(得分:1)

不知道双维数组实际上是什么意思,但是有一些排序算法特定于可以实现O(n)的某些情况。一个例子是Counting sort,如果要对1000到1000范围内的1000个整数进行排序,它可以在O(n)中排序。

编辑:事实上,它是一个多维数组,不会改变排序逻辑。您可以将索引(使用排序)转换为二维索引,如下所示:

array[i / N][i % N];

其中N是第一维的大小。

答案 1 :(得分:0)

您可以排序为普通数组。
E.g。

#include <stdio.h>
#include <stdlib.h>


int cmp(const void *a, const void *b){
    return *(int*)a - *(int*)b;
}

#define ROW_SIZE 3
#define COL_SIZE 4

int main(void){
    int M[ROW_SIZE][COL_SIZE]={{3,5,7,1},{4,9,2,0},{9,3,6,2}};
    int c,r,*p;

    for(p=&M[0][0],r=0;r<ROW_SIZE;++r){
        for(c=0;c<COL_SIZE;++c){
            printf("%d ",*p++);
        }
        printf("\n");
    }
    printf("\n");
    qsort(&M[0][0], ROW_SIZE*COL_SIZE, sizeof(int), cmp);
    for(p=&M[0][0],r=0;r<ROW_SIZE;++r){
        for(c=0;c<COL_SIZE;++c){
            printf("%d ",*p++);
        }
        printf("\n");
    }

    return 0;
}