【C语言】如果想用qsort这样的系统自带函数给一个二维数组的某一横行排序怎么做?

比如下面这个:13120015140018192223如何排成:12130014150018192223要求原先是0的项要忽略不进行排序...多谢!!!... 比如下面这个:
13 12 0 0
15 14 0 0
18 19 22 23
如何排成:
12 13 0 0
14 15 0 0
18 19 22 23
要求原先是0的项要忽略不进行排序...
多谢!!!
展开
 我来答
风若远去何人留
2015-06-16 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450132
专业C/C++软件开发

向TA提问 私信TA
展开全部

qsort是编译器函数库自带的快速排序函数。其原型为:

void qsort(void*base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));

参数含义如下:

base: 待排序数组首地址。

num: 数组中待排序元素数量。

width: 各元素的占用空间大小。

compare: 指向函数的指针,用于确定排序的顺序。

比较难以理解的是compare函数指针,其确定了如何去排序,通过修改该函数指针指向的函数体,可以对复杂类型进行排序,如结构体等。 也可以改变排序方式,如升序或降序。


要达到问题中的效果,需要在第一个参数传入数据所在行的首地址,第二个参数传入一行中元素的个数,第三行传入每个元素占用的空间,第四个传入自定义的比较函数指针(函数名)。


下面就以一个3行4列整型数组a[3][4],对其第二行(a[1])进行升序排序为例,写一个代码,辅助理解。

#include <stdio.h>
#include <stdlib.h>
int cmp(const void *a, const void *b)
{
return *((int *)a) > *((int *)b);//由于是整型数组,所以将指针转为整型指针后取值,再比较。
}
int main()
{
int a[3][4] = 
{
5,1,54,6,
22,12,44,32,
34,5,2,1
};//定义的原始数组,可以看到是乱序的。
int i,j;

qsort(a[1], 4, sizeof(int), cmp);

//以下代码输出数组元素值,以验证排序结果。
for(i = 0; i < 3; i ++)
{
for(j = 0; j < 4; j ++)
printf("%3d",a[i][j]);
printf("\n");
}
return 0;
}

程序运行后输出:

  5  1 54  6
 12 22 32 44
 34  5  2  1

可以看到第二行已经升序排列,而其它两个没有变化。

忽忽上升
2014-07-02 · TA获得超过1911个赞
知道小有建树答主
回答量:1166
采纳率:70%
帮助的人:578万
展开全部
#include<iostream>
#include<algorithm>
using namespace std;

const int M=3; //二维数组行数
const int N=4; //二维数组列数

int cmp( const void *a , const void *b ) //排序规则

    if(*(int*)a!=0&&*(int*)b!=0)  //如果不是0,则参与排序
return*(int*)a-*(int*)b;


int main()
{
int a[M][N]={{13,12,0,0},{15,14,0,0},{18,19,22,23}};
int b[M*N];  //定义一个一维数组做临时存储
int k =0;
for(int i=0; i<M; i++)  //二维数组转化成一维数组
for(int j=0; j<N; j++)
{
b[k]=a[i][j];
k++;
}
for(int i=0; i<M; i++)
qsort(b+(i*N),N,sizeof(int),cmp);//分段排序
k=0;
for(int i=0; i<M; i++)  //将一维数组赋值给原二维数组
{
for(int j=0; j<N; j++)
{
a[i][j]=b[k];
k++;
cout<<a[i][j]<<"\t";
}
cout<<endl;
}
return 0;
}

如果不是一定不用一维数组的话,如果不是一定不用C++的话,这个可以参考。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式