基于C语言,仅根据第一列对二维数组进行排序

5
我有一个双列数组,有1000行,我想根据每行的第一个元素对其进行排序,然后移动整个行。实质上,我希望第二列元素不会产生影响。
我在主函数中定义了数组:
double 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
请注意,它仅基于第一列的值进行排序,然后整行被交换。
我尝试使用标准插入排序算法,并将输入参数更改为二维数组,并在函数内部添加代码块以更改行的两个元素,但我一直收到以下错误:
error: array has incomplete element type 'double []' sort_double_array(double A[][], int n) {
我该怎么做?最好能够使用插入排序来实现。我可以发布我正在使用的插入排序函数,但它对于一维数组完美地工作。
非常感谢您的帮助,我真的卡在这里了。
谢谢,
詹姆斯。

使用编写比较函数的 qsort - BLUEPIXY
4个回答

3
尝试将函数声明为sort_double_array(double A[][2], int n);
多维数组除第一维外,所有维度都必须有边界。

void sort_double_array(double A[][2], int n) { int i, j; for (i=1; i<n; i++) { /*将A[i]左移至正确位置*/ for (j=i-1; j>=0 && A[j+1]<A[j]; j--) { double_swap(&A[j][0], &A[j+1][0]); double_swap(&A[j][1], &A[j+1][1]); } } } 这是我使用的代码块(插入排序)来对事物进行排序。这里有什么问题吗?因为我实现了你建议的方法,虽然在编译时没有返回任何错误,但它并没有对数组进行排序。 - James Adams
1
A[j+1]<A[j] - 这看起来不对 - 你是在比较地址吗?另一个下标在哪里? - Prabhu
你太棒了。这是一个遗留问题,当函数适用于单维数组时出现的。非常感谢。只需添加[0]即可。现在,如何将其反转,使其按从最大数字向下排序?我可以翻转不等式符号吗? - James Adams
是的,那应该可以完成任务。别忘了接受答案哦 :) - Prabhu

1
对于这种情况,每行似乎都有重要的意义,它似乎是某种对象?那么我建议忘记2D数组,并将其声明为结构体数组。结构体应该类似于:
#define N 2

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

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

my_data_t arr [1000];

现在,你的问题已经缩小到“如何对一个数组进行排序”。网上有很多相关信息。如果你不想自己实现排序算法(这只是为了教育目的),我建议使用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]);
}

为了改变排序顺序,请实现一个类似的“更多”功能。

我还没有真正学习/使用过结构体/typedef...有没有办法按照所描述的方式进行操作?只迭代数组的一列,然后切换整行?我尝试将函数声明为void sort_double_array(double A[][2], int n);但我认为它并没有按预期工作。有没有一种简单的方法来打印像我在O.P中那样的数组,以检查事情进展顺利? :) 编辑:我刚刚迭代了数组,所以打印不是问题,但排序并没有按计划进行。 - James Adams
@JamesAdams 在学习排序算法之前,你需要了解基本的C语言。 - Lundin

1
尝试将您的排序函数原型定义为void sort_double_array(double *A[], int n)。如果想获得额外的加分,使用size_t而不是int

如果我调用该函数时的参数是一个二维数组,那么这样行得通吗? - James Adams
通过该原型,A是一个指针数组,而不是指向数组的指针,这正是OP想要传递的。 - Some programmer dude

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");
        }
}

暴力破解!老派 - Jacobo Córdova

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接