在c中怎样用qsort对结构体数组进行多级排序?

比如说 我有个结构体数组里面的每个元素是 struct a{ int cat; string train; double plane; float tree;};
然后首先按cat从小到大排,然后train从大到小,接着plane大到小,最后tree 小到大.我已经写了个comparator了,但是输出结果跟预期不一样. 然后我的问题是我这样写多级排序的comparator对吗?不对的话该怎么写? 还有folat double这种类型的camparator怎么写?如果像我那样直接相减,是不是会发生溢出之类的情况?图片说明

2个回答

#include <stdlib.h>
#include <string.h>

struct st_test
{
        int cat;
        char caTrain[ 100 ];
        double plane;
        float  tree;
};

int cmp( const void *arg1, const void *arg2 );

int
main( void )
{
        int i = 0;
        struct st_test stArr[] = {
                { 2, "defghi", 5.2, 6.7 },
                { 2, "aefghi", 5.0, 6.9 },
                { 1, "aefghi", 5.1, 6.0 },
                { 1, "aefghi", 5.9, 5.0 },
                { 3, "elflfg", 9.0, 2.0 },
                { 3, "elflfg", 9.0, 1.0 }
        };

        qsort( stArr, 6, sizeof( struct st_test ), cmp );

        for( i = 0; i < 6; i++ )
        {
                printf( "%2d %8s %3.1lf %3.1f\n", stArr[ i ].cat, stArr[ i ].caTrain,
                        stArr[ i ].plane, stArr[ i ].tree );       
        }
        return 0;
}

int 
cmp( const void *arg1, const void *arg2 )
{
        static const double DSTDZERO = 0.0000001;
        static const float  FSTDZERO = 0.0000001;
        struct st_test *stArg1 = ( struct st_test * )arg1;
        struct st_test *stArg2 = ( struct st_test * )arg2;

        if( stArg1->cat != stArg2->cat )
                return  stArg1->cat > stArg2->cat ? 1 : -1;
        else if( strcmp( stArg1->caTrain, stArg2->caTrain ) != 0 )
                return -strcmp( stArg1->caTrain, stArg2->caTrain );
        else if( !( ( stArg1->plane - stArg2->plane >= -DSTDZERO ) && ( stArg1->plane - stArg2->plane <= DSTDZERO ) ) )
        {
                if( stArg1->plane - stArg2->plane < -DSTDZERO )
                        return 1;

                if( stArg1->plane - stArg2->plane > DSTDZERO )
                        return -1;
        } 
        else if( !( ( stArg1->tree - stArg2->tree >= -FSTDZERO ) && ( stArg1->tree - stArg2->tree <= FSTDZERO ) ) )
        {
                if( stArg1->tree - stArg2->tree < -FSTDZERO )
                        return -1;

                if( stArg1->tree - stArg2->tree > FSTDZERO )
                        return 1;
        } 

        return 0;
}
![图片说明](https://img-ask.csdn.net/upload/201508/26/1440600253_53796.png)
qq_42394696
qq_42394696 您好,如果是结构体里面有2个char数组,排序输出结构也不按照预期输出啊
22 天之前 回复
herochenling
herochenling 谢谢大神,辛苦了!!
大约 4 年之前 回复

图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
怎样用qsort对结构体数组进行排序
怎样用qsort对结构体数组进行排序.rn原代码的注释希望写详细一点.
能否利用qsort()对结构数组进行排序?
我有一个结构数组,我想对此结构数组进行排序,排序的依据是该结构的某一字段(某一变量)。这个任务能否用qsort()来完成?rnrn比如:rnstructrnrnint a;rnint b;rnint c[10];rnxx[100];rnrn我想把这个结构数组按照字段a降序排列,请问这个任务能用qsort来完成吗?rn
模拟实现qsort, qsort对多类型数据进行排序
使用回调函数,模拟实现qsort#include int int_cmp(const void * p1, const void * p2) {    return (*( int *)p1 > *(int *) p2); } void _swap(void *p1, void * p2, int size) {    int i = 0;    for (i = 0; i< siz
如何对结构体数组进行排序~~急
正在做一个C的学生管理系统rn要根据学生的平均分对文件中的学生表进行排序rnrn学生成绩的数据结构为:rntypedef structrn char numStu[10]; /* 学号*/rn char nameStu[10]; /* 姓名 */rn char classStu[10]; /* 班级 */rn float math; /* 高数 */rn float eng; /* 英语 */rn float compu; /* 计算机 */rn float phy; /* 物理 */rn float poli; /* 政治 */rn float sum; /* 总分 */rn float ave; /* 平均成绩 */rn int placeN; /* 名次 */rn STUSCORE; rnrn用的是线性存储的方式rn如何进行排序,有没有什么实用的方法,万分感谢,急用!
利用sort对结构体数组进行排序
bool cmp(pcb a,pcb b) {         if(a.super==b.super)                   return a.super     return a.super>b.super;  } // sort(x,x+n,cmp);//根据cmp去进行排序 PS:记得头文件加上algorithm还有别忘记了using na
C语言——qsort排序
使用qsort()函数对随机生成的数组进行排序: 要点: 1、产生随机数的方法 2、C语言内置qsort()使用方法 3、程序运行的计时方法 #include #include #include #define N 100000 void sort_begin(int a[]){ int i; srand(time(NULL)); for (i = 0; i < N; ++
利用c函数qsort对结构体进行排序
[code=&quot;java&quot;] #include #include typedef struct{ int x; int y; int h; }dot; int cmp(const void *a, const void *b) { return (*(dot *)a).h - (*(dot *)b).h; } int main() { dot line[9]...
真正的qsort结构体多级排序,不是某个骗子qsort多级排序
某个CSDN里上传的qsort结构体多级排序的太让我气愤了,辛辛苦苦赚的积分第一次下载就被这种东西给骗了,不能运行不能看,又不好,太可恶了。。。 这份代码OJ测试通过,能看能运行,有释义,不要再被那个说啥子ACM必学啊啥的给骗了。
qsort对多维数组和结构体的排序
多维数组对于malloc动态申请的多维数组(指针数组)以一个例子解析: 要求—— 打算操作一个数组,数组的每个元素是一个指针,指向2个元素的数组。元素的大小关系为先比较第一个元素,第一个元素相同比较第二个元素。 首先,通过malloc对指针数组进行分配: 先分配一个指向元素为int *的一维数组,所以数组类型为int **; 然后,针对每一个数组里的int *型指针,分配一个一维数组,数组类型
Qsort对二位数组的排序
#include #include int cmp(const void *a,const void *b) { return((int*)a)[1]-((int*)b)[1]; } int main() { int t,n,i,x1; int m[1005][2]; scanf("%d",&t); for(i=1;i<=t;i++) {
vector中如何用qsort进行排序
class Arnrn;rnvector AV;rn如何用qsort对AV进行排序rn谢谢
如何利用STL中的sotr算法对结构体数组进行排序?
结构体定义如下:rnstruct Nihernrn CString name;rn CString route;rn float da[3];rn rn float ra[3];rn float dchazhi;rn float rchizhi;rn float totalchazhi;rnrn;rn定义一个结构体数组 Nihe nihe[30];rn我想按照 totalchazhi 从小到大对nihe[30]进行排序,rn为什么我的程序编译不通过呢?rn大家给看看rn BOOL comp(const Nihe *lhs ,const Nihe *rhs )rn rn return lhs->totalchazhi < rhs->totalchazhi;rn rn std::sort(nihe,nihe+30,comp);rnrn
利用c函数qsort排序
[code=&quot;java&quot;] #include #include //qsort函数 有四个参数 //1.代表排序数组的基址 //2.要排序数组的长度,也可以对这个数组的子序列进行排序 //3.数组元素的内存长度 //4.要进行比较的函数 int cmp(const void * a, const void *b) { return *(int *)a - *(int ...
C语言排序函数qsort( )
关于c语言排序的问题,以前我都是用冒泡排序或者快速排序,知道这几天,在杭电上面打ACM的时候,才发现又一种排序的函数,就是qsort();qsort()括号里面有4个参数 第一个参数是将要排序的数组名array; 第二个参数是将要排序的数量n; 第三个参数是每个要排序的参数的大小xizeof(array[o]); 第四个参数是自己写的一个比较函数cmp;前三个参数还是比较好搞的,但是最后一个
C/C++中排序的库函数sort和qsort
1.sort   必须添加头文件#include  sort属于标准模板库,只适用于c++,c语言不支持. #include #include using namespace std; int main() { int a[] = { 2, 5, 6, 4, 2, 3, 5, 8, 9, 6, 5, 4, 2, 3 }; sort(a, a + sizeof(a) /
qsort排序
1:整型排序: #include&amp;lt;bits/stdc++.h&amp;gt; using namespace std; int a[100]; int cmp(const void *a,const void *b) { return (*(int*)a-*(int*)b); } int main() { int n; cin&amp;gt;&amp;gt;n; fo...
qsort 排序
使用qsort排序一个整型数组,一个浮点型数组,一个字符串数组。#include <stdio.h> #include <stdlib.h>int Compare(void* elem1,void* elem2) { return (*(int *)elem1)-(*(int*)elem2); } void Print(int * arr,int sz) { int i = 0;
sort函数对结构体多级排序
(一)为什么要用c++标准库里的排序函数 Sort()函数是c++一种排序方法之一,学会了这种方法也打消我学习c++以来使用的冒泡排序和选择排序所带来的执行效率不高的问题!因为它使用的排序方法是类似于快排的方法,时间复杂度为n*log2(n),执行效率较高! (二)c++标准库里的排序函数的使用方法 I)Sort函数包含在头文件为#include&amp;lt;algorithm&amp;gt;的c++标准...
使用qsort对二维数组李的某一列元素进行排序
/* 这是一个测试qsort的函数,主要是针对一个二维数组,对其中的某一列进行 排序,之后按照这一列的排序重排整个二维数组 */ #include #include /* comp 作为qsort的一个参数,其定义了一个数组按那个元素排序 */ int comp(const void *a,const void *b) { if(((double*)a)[1]<((doub
求救————使用标准库函数qsort(),对浮点数组进行从小到大排序!
使用标准库函数qsort(),对浮点数组进行从小到大排序!rn数组如下:rn32.1, 456.78, 332.67, 442.0, 98.12, 451.79, 340.12, 54.55, 99.87, 72.5rnrn小弟我现在的疑点是不知道qsort(void*,size_t nelem,size_t width,int(*fcmp)(const void*,const void*))内部的运行机理,不知道怎么调用那个比较函数fcmp!rn还望大侠们指点!
用qsort对指针数组进行排序,失败了,帮忙看看
[code=C/C++]rn#include rn#include rn#include rnrn#define SZ 10rnrntypedef struct nodernrn unsigned long id; // 排序时,要根据结构体的id进行排序rn node;rnrnint cmp(const void* pn1, const void* pn2); // 比较函数rnrnint main(int argc, char* argv[])rnrn int nLoop = 0;rn node* Array[SZ];rnrn srand(time(NULL));rn for(nLoop = 0; nLoop < SZ; ++nLoop)rn rn Array[nLoop] = malloc(sizeof(node));rn Array[nLoop]->id = rand();rn printf("%d ", (Array[nLoop])->id );rn rn printf("\n\n");rnrn qsort(Array, SZ, sizeof(node*), cmp);rnrn for(nLoop = 0; nLoop < SZ; ++nLoop)rn rn printf("%d ", (Array[nLoop])->id );rn rn printf("\n\n");rnrn return 0;rnrnrnint cmp(const void* pn1, const void* pn2) // 比较函数rnrn const node* p1 = pn1;rn const node* p2 = pn2;rn int val;rn if(p1->id < p2->id)rn rn val = -1;rn rn else if (p1->id == p2->id)rn rn val = 0;rn rn elsern rn val = 1;rn rn return val;rnrn[/code]
对vector模板进行排序的方法——sort, stable_sort, qsort
I am trying to sort the "sth" integer value within the vector of class Entry using qsort. The code for the same is as follows. But after applying qsort, also the values remain the same. When I tried t...
[B.U] 习题 用标准库函数qsort(),对各类数组进行排序
编制程序,使用标准库函数qsort(),对各类数组进行排序。rn1) 对整数数组进行排序.比较是以一个整数的各位数字之和的大小为依据,从小rn 到大排列.数组中元素值为:rn 12,32,42,51,8,16,51,21,19,9rnrn2) 对浮点数组进行排序.从小到大排列. 数组中元素为:rn 32.1, 456.87, 332.67, 442.0, 98.12, 451.79, 340.12, 54.55, 99.87, 72.5rnrn3) 对字符串数组进行排序. 比较是以各字符串的长度为依据, 如果长度相等,rn 再比较字符串的值,从小到大排列.数组中的元素为:rn enter, number, size, begin, of, cat, case, program, certain, arnrn ---- 钱能《C++程序设计教程》P183rnrn
C中的qsort()用法
#include <iostream> #include <cstdlib>using namespace std; //const void*为指向任意类型的常量的指针可以指向其他的位置,void const*为常指针并且不能改变指向的位置。 int cmp(const void *a, const void *b) { //强制指针类型转换后解指针 return *(char *
怎样用VB对SQL7.0数据表中的记录进行重新排序?
我想用VB对SQL7.0中的数据表重新排序.比如说编号字段,按重小到大的顺序排列.rn小弟在此先谢过了
关于qsort对CArry的排序的问题
小弟现有一个由结构体组成的动态数组,现要对其进行排序,如何进行?rn[code=c] typedef struct FileNamern rn CString filenames;rn int nfilename;rn FileName;rn typedef CArray m_arrfilenames;rn m_arrfilenames m_filename;[/code]rnrnrn[code=c]void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );rn[/code]rn就是这里的返回值应该怎么写?rn[code=c]int Comparison(const void *a, const void *b)rnrn return ;rn[/code]rn求赐教rn
请问怎样用C对TXT文件进行合并
请问怎样用C对TXT文件进行合并
C语言qsort排序大全 多种数据类型的qsort
C语言:巧用qsort,编程省时省力的技巧,难道还不心动吗?
怎么用库函数qsort对指针排序
[code=C/C++]rn#include rn#include rnint main(void)rnrn char s[1000][1000];rn char a[2002], b[2002], *p[1000], *t;rn int i, j, n;rn while (scanf("%d", &n), n != 0)rn rn for (i = 0; i < n; i++)rn rn scanf("%s", s[i]);rn p[i] = s[i];rn rn for (i = 0; i < n-1; i++)rn rn for (j = i+1; j < n; j++)rn rn [color=#FF0000] sprintf(a, "%s%s", p[i], p[j]);rn sprintf(b, "%s%s", p[j], p[i]);rn if (strcmp(a, b) > 0)[/color] rn t = p[i];rn p[i] = p[j];rn p[j] = t;rn rn rn rnrn for (i = 0; i < n; i++)rn printf("%s", p[i]);rn printf("\n");rn rnrn return 0;rnrnrn[/code]rnrn要满足rnsprintf(a, "%s%s", p[i], p[j]);rnsprintf(b, "%s%s", p[j], p[i]);rnif (strcmp(a, b) > 0)rn这个条件rn来调用qsort
sort 与qsort 使用方法 结构体多级排序 适合于acm竞赛
经典的acm排序算法,轻松教你学会sort和qsort的使用方法。一个简单,一个比较繁杂,但是运行速度却相对来说较快。希望对大家有帮助,尤其是acm的同学。sort与qsort对结构体多级排序是非常有用的。
多级排序....
怎么用C/C++实现一个多级排序???rn例如下:rn实现一个小学生成绩管理系统,要求把成绩好的同学放到前面的。我们首先是按个人的总成绩进行排名,如果某两个人的总分相同,则按他们的语文成绩进行排名,如果总成绩和语文成绩都相同时,对于这两个人,我们是按照他们的数学成绩进行排名的,他们每个人都有三门课程,语文,数学和英语!rn首先输入一行为总共输入学生的数目N,然后在2到N+1行中分别输入学生姓名和对应学生的总分,语文和数学成绩rn输出最后排序顺序的名字序列。保证不会存在两个人总成绩和各门的成绩均分别相同的情况。rn如:rn3rnHenry 225 100 98rnMarry 210 95 100rnJhon 210 98 85rnrnrn输出:rnrnHenry rnJhon rnMarryrnrn谢谢了!!!rnrn
多级排序和横向排序
微软MVP用通俗的讲法,以幽默的方式呈现一个特别的EXCEL 2016课程,课程生动有趣,扣人心弦。从零开始,逐步教你学习Excel 。同时课程中使用Excel插件-《O啦》来简化工作。
多级排序!
Description 经过了一个前一段时间对数据结构中排序一章的学习,相信大家对排序也有了较深的感情。当然,这就是一个简单的排序问题,try to do it ^_^! 在众多的排序算法中,你会如何选择呢?假设现在需要你实现一个小学生成绩管理系统,要求把成绩好的同学放到前面的。我们首先是按个人的总成绩进行排名,如果某两个人的总分相同,则按他们的语文成绩进行排名,如果总成绩和语文成绩都相同时,对于
七种qsort排序
经典 很有帮助~~~~~~~~~~~
qsort排序失败
这是我的代码这是我的测试结果各位大神求解释为什么会排序失败按道理来说不是升序就是降序偏偏这么奇葩rn#includern#includern#includernusing namespace std;rnint comp(const void *a,const void *b)rnrnint c;rnreturn c=((string *)a<=(string *)b?1:-1);rnrnint main()rnrn int a[7];rn for(int x=0;x<7;x++)rn cin>>a[x];rn qsort(a,7,sizeof(int),comp);rn qsort(a,7,sizeof(int),comp);rn rn for(int x=0;x<7;x++)rn cout<
常用排序之qsort和sort
常用函数qsort和sort用法总结
【Eternallyc】qsort排序函数用法
qsort   功 能: 使用快速排序例程进行排序 用 法: void qsort(void base, int nelem, int width, int (*fcmp)(const void ,const void *));   各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针用于确定排序的顺序 排序方法有很多种, 选择排序,冒泡排序,归并
分析C标准库中通用排序函数 qsort,并进行举例排序(数字篇)
利用库函数排序(数字) ## 问题引出: 一 : 为什么要用库函数排序 ? 1 . 自己写排序算法,效率底下。 2 . 利用库函数的函数,一个是安全性高,另一个是效率高,不必从头造轮子。 二 : 哪一个库函数能提供通用排序功能?在哪个头文件中? 1 . void qsort(void
Qt排序qSort使用方法
助手文档中对于qSort的介绍中,对于简单类型的排序讲解的很详细了。 这里主要讲对于结构体类型的排序 struct Info{ QString id; QString name; int age; }; QList infoList; 在这里对于infoList按照id字符串排序 void NetManager::devListSort(QList *list) {
qsort()函数排序
#include <iostream> #include <algorithm> #include <math.h>int compare_desc(const void *a , const void *b) ; void main() { int A[3] = {2 , 1 , 3} ; qsort(A , 3 , sizeof(int) , compare_desc) ;
相关热词 c# 线程结束时执行 c# kb mb 图片 c# 替换第几位字符 c#项目决定成败 c# 与matlab c# xml缩进 c#传感器基础 c#操作wps c# md5使用方法 c# 引用父窗口的组件