我有一个双类型数组,有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(双A[][],int n){
我该怎么做?如果能够使用插入排序,那就太好了。我可以发布我用于插入排序的函数,但它非常适合一维数组。
提前谢谢你,真的被困在这里了。
干杯,
詹姆斯。
尝试将函数声明为sort_double_array(double A[][2], int n);
多维数组必须具有除第一个维度之外的所有维度的边界。
尝试将排序函数原型化为void sort_double_array(double *A[], int n)
。对于额外的奖励积分,请使用size_t
而不是int
。
对于这个特定的情况,听起来每一行都有重要的意义,它似乎是某种对象?然后我建议忘记2D数组,将其声明为structs数组。该结构看起来像:
#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;
对于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"。
#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");
}
}