C语言qsort函数怎么用？

#include
using namespace std;

typedef struct
{
unsigned long id;
int score;
}record;

int main()
{
int id_cmp(const void* s1,const void* s2);
int score_cmp(const void* s1,const void* s2);

``````record recordset[] = {{3,99},{5,87},{4,56},{2,100},{1,17}};

int recordcount = sizeof(recordset) / sizeof(record);

printf("排序前:\n");
for(int i = 0; i < recordcount;i++)
printf("%8d %8u %8d\n",i,recordset[i].id,recordset[i].score);

qsort(recordset,recordcount,sizeof(record),id_cmp);
printf("排序后:\n");
for(int i = 0; i < recordcount;i++)
printf("%8d %8u %8d\n",i,recordset[i].id,recordset[i].score);

qsort(recordset,recordcount,sizeof(record),score_cmp);
printf("排序后:\n");
for(int i = 0; i < recordcount;i++)
printf("%8d %8u %8d\n",i,recordset[i].id,recordset[i].score);

return 0;
``````

}

int id_cmp(const void* s1,const void* s2)
{
record* p1 = (record* )s1;
record* p2 = (record* )s2;
if(p1->id < p2->id) return -1;
else if(p1->id == p2->id) return 0;
else return 1;
}

int score_cmp(const void* s1,const void* s2) //这个函数指针为什么能改变排序顺序
{
record* p1 = (record* )s1;
record* p2 = (record* )s2;
if(p1->score < p2->score) return -1;
else if(p1->score == p2->score) return 0;
else return 1;
}

2个回答

sort也能进行排序，比如对数组a,从1号单元到n号单元排序，排序函数cmp,sort(a+1,a+1+n,cmp);就结束了。

c++中qsort函数自定义比较函数的问题（杭电1009）
#include<iostream> #include<iomanip> #include<stdlib.h> #include<stdio.h> #include<algorithm> using namespace std; struct room { double amount,l; int number; }; int comp(const void *x,const void *y); int main() { int n,m,k; double sum; while(cin>>n>>m) { sum=0; if(n==-1&&m==-1) break; room *a=new room [m]; for(k=0;k<m;k++) { cin>>a[k].amount>>a[k].number; a[k].l=a[k].amount/a[k].number; } qsort(a,m,sizeof(a[0]),comp); for(k=0;k<m;k++) { if(n>a[k].number) { sum+=a[k].amount; n-=a[k].number; } else { sum+=double(n)/a[k].number*a[k].amount; break; } } // for(k=0;k<m;k++) // cout<<a[k].amount<<" "<<a[k].number<<" "<<a[k].l<<endl; cout<<setiosflags(ios::fixed)<<setprecision(3)<<sum<<endl; delete [] a; } return 0; } int comp(const void *x,const void *y) { return (*(room *)y).l>(*(room *)x).l?1:-1; } 以上代码中qsort的比较函数如果写成上述代码形式可以过杭电1009 而如果写成 int comp(const void *x,const void *y) { return (*(room *)y).l-(*(room *)x).l; } 则过不了，请问大神们这两种写法有什么区别啊？ int comp(const void *x,const void *y) { return (*(room *)y).l>(*(room *)x).l?1:-1; } 和 int comp(const void *x,const void *y) { return (*(room *)y).l-(*(room *)x).l; } 题目网址：http://acm.hdu.edu.cn/showproblem.php?pid=1009
C语言 如果qsort比较的是long long的整形，cmp函数应该怎么写
C语言 如果qsort比较的是long long的整形，cmp函数应该怎么写 直接写 int cmp(const void *a,const void *b) { if(*(long long *)a>*(long long *)b) return 1; if(*(long long *)a<*(long long *)b) return -1; if(*(long long *)a==*(long long *)b) return 0; } 或者 int cmp(const void *a,const void *b) { return *(long long *)a>*(long long *)b; } 都不行 求大神给个解答

#include<stdio.h> #include<stdlib.h> #include<string.h> #define WORD_LEN 20 #define P_NUM 10 int read_line(char s[],int n); int compare_str(const void *p,const void *q); int main(void) { char word[WORD_LEN]; char *str[P_NUM]; int n,i=0,num_remind=0; for(;;){ if(num_remind==P_NUM){ printf("No space left"); break; } printf("Enter word:"); n=read_line(word,WORD_LEN); if(n==0) break; str[i]=malloc(strlen(word)+1); if(str[i]==NULL){ printf("No space left.\n");break; } strcpy(str[i],word); num_remind++;i++; } qsort(str,num_remind,strlen(word),compare_str); //str是待排序数组 //num_remind是数组元素的个数 //strlen(word)是元素（存放字符串的字符数组）的大小 //compare_str是比较函数 for(i=0;i<num_remind;i++) printf(" %s\n",str[i]); return 0; } int read_line(char s[],int n) { int ch,i=0; while((ch=getchar())!='\n') if(i<n) s[i++]=ch; s[i]='\0'; return i; } int compare_str(const void *p,const void *q) { return strcmp((const char *)p,(const char *)q); } 输出后还是原顺序
c语言stdlib.h头文件中qsort的实现代码

c语言考研题求助，qsort的应用。

C语言：用qsort()和strcmp实现对字符串数组的字典序排序
#include<stdio.h> #include<stdlib.h> #include<string.h> int mycomp(const void *p1,const void *p2) { const char *a1=(const char*)p1; const char *a2=(const char*)p2; return strcmp(a1,a2); } int main() { int i; char *a[5]={"ssioo","abcde","bcade","bacd","jjjjj"}; qsort(a,5,sizeof(char*),mycomp); for(i=0;i<5;i++) { printf("%s ",a[i]); } return 0; } warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]| 输出结果是没有经过排序的 问：要如何修改？要实现字符串数组字典序排序有什么思路？
c语言标准库函数 源代码 没看懂 求大佬们指教
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*))这是标准库快速排序的函数请问为什(*compar)里有*号 为啥啊 int* com我理解是返回一个int型指针 然而快排的*号跟函数名有关 请问为啥啊

#include <stdio.h> int qsort(int left,int right) { int i,last; if(left>=right) return 0; last=left; printf("%d\n",last); qsort(last+1,right); } int main() { int b=0,c=9; qsort(b,c); }输出为012345678 但是 #include <stdio.h> int qsort(int left,int right) { int i,last; if(left>=right) return 0; last=left; printf("%d\n",last); qsort(last++,right); } int main() { int b=0,c=9; qsort(b,c); } 只是last+1变为last++为什么结果截然不同啊
c语言 摘桃子问题

C语言字符如何比较排序啊，大神们看看我的代码为什么不对

Java学习的正确打开方式

linux系列之常用运维命令整理笔录

Python十大装B语法
Python 是一种代表简单思想的语言，其语法相对简单，很容易上手。不过，如果就此小视 Python 语法的精妙和深邃，那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点，并附上详细的实例代码。如能在实战中融会贯通、灵活使用，必将使代码更为精炼、高效，同时也会极大提升代码B格，使之看上去更老练，读起来更优雅。

Docker 技术发展为微服务落地提供了更加便利的环境，使用 Docker 部署 Spring Boot 其实非常简单，这篇文章我们就来简单学习下。首先构建一个简单的 S...

SQL-小白最佳入门sql查询一

redis分布式锁，面试官请随便问，我都会

Nginx 原理和架构
Nginx 是一个免费的，开源的，高性能的 HTTP 服务器和反向代理，以及 IMAP / POP3 代理服务器。Nginx 以其高性能，稳定性，丰富的功能，简单的配置和低资源消耗而闻名。 Nginx 的整体架构 Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求，主要负责调度工作进程：加载配置、启动工作进程及非停升级。worker 进程负责处...
“狗屁不通文章生成器”登顶GitHub热榜，分分钟写出万字形式主义大作

《程序人生》系列-这个程序员只用了20行代码就拿了冠军

11月8日，由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办，科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。 　　区块链技术被认为是继蒸汽机、电力、互联网之后，下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力，电力解决了人类基本的生活需求，互联网彻底改变了信息传递的方式，区块链作为构造信任的技术有重要的价值。 　　1...
Java世界最常用的工具类库
Apache Commons Apache Commons有很多子项目 Google Guava 参考博客

【技巧总结】位运算装逼指南

Android 9.0 init 启动流程

8年经验面试官详解 Java 面试秘诀