2012-03-12 87 views
1

我想使用qsort排序指针的二维数组。我现在唯一的问题是最初我使用静态声明的数组切换到指针。我几乎想要转向结构,但却固执地认为我无法实现这个目标。Qsorting 2D指针数组

到目前为止我MALLOC指针[array2d [米] [3]是预期的大小]的2D阵列:

 int **array2d; 

    array2d = (int**)malloc((m)*sizeof(int*)); 

    for(i=0; i<=m; i++) 
     array2d = [i]=(int*)malloc(3*sizeof(int)); 
    qsort(array2d, m, 3*sizeof(int**),comp); 

我的比较是:

int comp(const void* left, const void*right)                     
{ 

    const int *a = *(const int**)left; 
    const int *b = *(const int**)right; 

    return a-b; 
} 

虽然我不是确定如何构建比较以使用2d指针。

+0

你的'comp'函数是错误的。如果'a'是最小可能的整数值而'b'是1呢?那么'a - b'将是整数运算中最大可能的整数值(在大多数系统中),即使'comp'的结果应该是负值,这也是正值。 – 2012-03-12 19:19:54

+0

三个整数是单个大值吗? (即如果int是32位,它是一个96位数) – Skizz 2012-03-12 19:22:36

+0

3最初表示第二维内的3个空格,就像第1行有3个值。 – 2012-03-12 19:26:49

回答

1

从您提供的代码片段中,我假设您正在尝试分别对矩阵的每一行进行排序。我注意到的第一件事是在矩阵的列(第二索引)的内存分配中存在拼写错误。一个numRow行 X 为numColumns矩阵的

合适的内存分配情况如下:

/* loop counter */ 
int i; 

/* dynamic array sizes */ 
const int numRow = 5; 
const int numColumns = 25; 

/* allocate the row pointers */ 
int **dynamic2d = (int **)malloc(numRow * sizeof(int *)); 

/* for each row pointer */ 
for(i = 0; i < numRow; i++) 
{ 
    /* allocate columns */ 
    dynamic2d[i] = (int *)malloc(numColumns * sizeof(int)); 
} 

接下来你将不能够简单地调用的qsort(..)方法只有一次。该方法需要一个“平坦”或一维数组。您需要分别为矩阵的每一行调用qsort(...)方法。这是演示如下:

/* sort array */ 
for(i = 0; i < numRow; i++) 
    qsort(dynamic2d[i], numElements, sizeof(int *), comp); 

最后,你犯了一个比较方法的错误。此方法有严格的规则,需要遵循以正确工作。当前specifications说,“如果第一个参数分别小于,等于或大于第二个参数,应用程序应确保该函数返回小于,等于或大于0的整数如果两个成员比较相同,它们在排序阵列中的顺序是未指定的

这是一个简单的修复。简单地编写逻辑来产生如下所示的结果:

int comp(const void* firstArg, const void* secondArg) 
{ 
    /* get the values of the arguments */ 
    int first = *(int *)firstArg; 
    int second = *(int *)secondArg; 

    /* return the value as expected by the qsort() method */ 
    if(first < second) 
    { 
     return 1; 
    } 
    else if(second < first) 
    { 
    return -1; 
    } 

    return 0; 
} 

最后要注意的是,这将排序最大至至少。 如果您希望最小,请勿在比较器中切换逻辑。排序不会返回准确的结果。正确的方法是从后向前读取阵列,如下所示: 您可以交换比较器中的参数以更改排序顺序或从后向前读取结果。

int comp(const void* firstArg, const void* secondArg) 
{ 
    /* get the values of the arguments */ 
    int first = *(int *)secondArg; 
    int second = *(int *)firstArg; 
    ... 
} 

/* print greatest to smallest */ 
for(i = 0; i < numRow; i++) 
{ 
    /* start at front and work to back */ 
    for(j = 0; j < numColumns; j++) 
     printf("%d ", dynamic2d[i][j]); 
    printf("\n"); 
} 

/* print smallest to greatest */ 
for(i = 0; i < numRow; i++) 
{ 
    /* start at back and work to front */ 
    for(j = numColumns- 1; j >= 0; j--) 
     printf("%d ", dynamic2d[i][j]); 
    printf("\n"); 
} 

希望这有助于!如果你需要将整个矩阵作为一个整体进行排序......这是一个不同的野兽。