仅基于第一列在C中对二维数组进行排序

时间:2014-04-23 06:42:48

标签: c arrays sorting multidimensional-array

我有一个包含2列的双类型数组,最大行数为1000,我想根据每行的第一个元素进行排序,然后移动整行。实质上,我希望第二列元素没有影响。

我将数组介绍为:

  

双A [1000] [2];

在我的主要。 A的一个例子可能是:

  

18.0 2.0

     

5.5 3.5

     

10.0 8.1

     

4.0 2.5

排序后,我希望它看起来像这样:

  

4.0 2.5

     

5.5 3.5

     

10.0 8.1

     

18.0 2.0

知道如何反向排序也很好,这样看起来像这样:

  

18.0 2.0

     

10.0 8.1

     

5.5 3.5

     

4.0 2.5

注意它是如何根据第一列中的值进行排序的,然后整行被切换。

我尝试使用一个非常标准的插入排序算法,只是将输入参数更改为二维数组,并在函数内部有一个代码块来更改行的两个元素,但我不断收到此错误:

  

错误:数组的元素类型不完整'double []'   sort_double_array(double A [] [],int n){

我该怎么做?能够使用插入排序来做它会很好。我可以发布我用于插入排序的函数,但它适用于一维数组。

提前非常感谢,真的被困在这里。

干杯,

詹姆斯。

4 个答案:

答案 0 :(得分:3)

尝试将该函数声明为 sort_double_array(double A[][2], int n);

多维数组必须具有除第一个之外的所有维度的边界。

答案 1 :(得分:1)

尝试将排序功能原型设为void sort_double_array(double *A[], int n)。如需额外奖励积分,请使用size_t而不是int

答案 2 :(得分:1)

对于这个特定情况,听起来每行都有重要意义,它似乎是某种对象?然后我建议忘记2D数组并将其声明为结构数组。该结构看起来像:

#define N 2

typedef struct
{
  double data [N];
} my_data_t;

然后你声明一个该结构的数组:

my_data_t arr [1000];

现在你的问题缩小到"如何对x"的数组进行排序。在整个网络上有大量的信息。如果你不想自己实现排序算法(你只会出于教育目的),我建议在stdlib.h中使用qsort()函数。 对于这个有效的qsort是:    qsort(arr,sizeof(arr)/ sizeof(* arr),sizeof(* arr),less);

对于qsort,您将实现排序使用的比较函数。像这样:

int less (const void* a, const void* b)
{
  const my_data_t* ptr_a = a;
  const my_data_t* ptr_b = b;

   return (int)(ptr_a->data[0] - ptr_b->data[0]);
}

要更改排序顺序,请执行类似的功能" more"。

答案 3 :(得分:0)

#include<stdio.h>
#include<stdlib.h>
int main()
{
        int arr[4][2] = {18,2,5,3,10,8,4,2};
        int row=4,col=2;
        int i,j,k=0,x,temp;
        for(i=0;i<row;i++)
        {
                for(j=i+1;j<row;j++)
                {
                        if(arr[i][k] > arr[j][k])
                        {
                            for(x=0;x<2;x++) {
                                temp=arr[i][x];
                                arr[i][x]=arr[j][x];
                                arr[j][x]=temp;
                                }
                        }
                }
        }
        for(i=0;i<row;i++)
        {
                for(j=0;j<col;j++)
                printf("%d ", arr[i][j]);
                printf("\n");
        }
}