【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的项要忽略不进行排序...
多谢!!! 展开
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的项要忽略不进行排序...
多谢!!! 展开
2个回答
展开全部
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
可以看到第二行已经升序排列,而其它两个没有变化。
展开全部
#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++的话,这个可以参考。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询