为了账号安全,请及时绑定邮箱和手机立即绑定

如下数组,请问该怎么排序?

如下数组,请问该怎么排序?

紫衣仙女 2022-11-19 19:19:54

例如数组 {{4,2},{1,7},{4,5},{1,2},{1,1},{4,1}}排序后为{{1,1},{1,2},{1,7},{4,1},{4,2},{4,5}}

查看完整描述

1 回答

?
肥皂起泡泡

TA贡献1530条经验 获得超5个赞

在C语言中,二维数组按行存储,对每一行排序很方便,可以把每一行当成一个一维数组,使用排序函数直接进行排序。
然而对每一列进行排序,就不能直接当成一维数组进行排序。但是仍然可以把第j列a[0...M-1][j]在逻辑上当成一维数组进行排序,下面以使用冒泡排序为例对其排序。
对二维数组按列排序后,进一步展示了如何调用快速排序函数按行进行排序。
程序源码:
#include <stdio.h>
#include <stdlib.h>

#define M 3
#define N 3

//输出二维数组的函数
void print(int a[][N])
{
int i,j;
for(i=0;i<M;i++)
{
for(j=0;j<N;j++)
{
printf("%d ",a[i][j]);
}
printf("\n");

}

//qsort的cmp函数
int cmp(const void*a, const void *b)
{
return *(int*)a-*(int*)b;
}

int main(int argc, char* argv)
{

int a[M][N]={3,2,1,9,8,7,6,5,4};

printf("按列排序前的二维数组是:\n");
print(a);
printf("\n");
int j;
for(j=0;j<N;j++)//对每一列进行升序排序 
{
//对第j列进行排序 
int m,n;
int t;
for(m=M-1;m>0;m--)
{
for(n=0;n<m;n++)
{
if(a[n][j]>a[n+1][j])
{
t=a[n][j];
a[n][j]=a[n+1][j];
a[n+1][j]=t;
}



printf("按列排序后二维数组变为:\n");
print(a);
printf("\n"); 

//对按列排序后的二维数组按行升序排序 (调用快速排序函数) 

int i;
for(i=0;i<M;i++)
{
qsort(a[i],N,sizeof(a[i][0]),cmp);


printf("按列排序后再按行排序后二维数组变为:\n");
print(a);
printf("\n");
system("pause");
return 0;
}


查看完整回答
反对 回复 2022-11-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信