c语言-C语言qsort函数怎么用?

问题描述

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 %8dn",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 %8dn",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 %8dn",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;
}

解决方案

因为排序的关键是对要排序的数据两两比较大小,比较大小的不同决定了排序依据的不同,传入不同的函数指针,实现不同的大小比较就能改变排序顺序。

解决方案二:

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

时间: 2024-11-01 20:32:57

c语言-C语言qsort函数怎么用?的相关文章

C语言中qsort函数用法实例小结_C 语言

本文实例汇总了C语言中qsort函数的常见用法,非常具有实用价值.分享给大家供大家参考.具体分析如下: C语言中的qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序. 一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数

用c语言编写一个数组排序函数 要求如下

问题描述 用c语言编写一个数组排序函数 要求如下 1.既能从小到大也能从大到小 2.对int,unsigned int,const int,double 等类型数组都适用 3.尽量简洁 解决方案 参考系统函数qsort的实现.允许用户传一个比较函数指针.各种类型,按照大小排序,都由用户传这个比较函数实现.这样就通用了. 解决方案二: 你去搜,c 模板 排序,能搜到 解决方案三: 你是刚刚学习C语言么?你现在想要的是一段严格规范的代码,还是说一种编程的思路,又或者,只是为了应付一下某个任务?

c语言-C语言选择法排序函数的实现问题

问题描述 C语言选择法排序函数的实现问题 我在看C语言程序设计是遇到一个问题,用选择法对数组中的5个整数按由小到大排序 #include int main() { void sort(int array[],int n); int a[5],i; printf("Please input 5 numbers:n"); for(i=0;i<5;i++) scanf("%d",&a[i]); sort(a,5); printf("the sort

C语言中字符串常用函数strcat与strcpy的用法介绍

以下是对C语言中字符串常用函数strcat与strcpy的使用方法进行了详细的分析介绍,需要的朋友可以参考下   strcpy原型声明:extern char *strcpy(char* dest, const char *src);头文件:#include <string.h>功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串. 返回指向dest的指针.函数实现: 复制代

关于c语言的问题,函数定义时候为什么可以不加形参的类型

问题描述 关于c语言的问题,函数定义时候为什么可以不加形参的类型 比如这段代码 void rkt1f(t,y,n,d) int n; double t,y[],d[]; {t=t; n=n; d[0]=y[1]; d[1]=-y[0]; d[2]=-y[2]; return; } 可以运行,这是用Runge-Kutta计算的一个函数,求教学,这块为什么会对啊 解决方案 C语言允许你在函数体的头部定义参数,而不写在括号里面.语法就是这么规定的,但是这种写法不推荐 解决方案二: 表示没见过,类型加上

c语言-C语言,如何在一个函数内部,获取这个函数入口点的地址?

问题描述 C语言,如何在一个函数内部,获取这个函数入口点的地址? 1C # Git@OSC 的 Android 和 iOS 客户端全面开源 include #include void show(void* p) { printf(""%pn""p); } int main() { show(&show); show(show); return 0; } Output: 1 2 0x8048480 0x8048480 解决方案 答案处处有.函数名称就是入口地址

c语言-C语言编写一个输出的函数

问题描述 C语言编写一个输出的函数 编写一个函数,输出数组,要求通过参数指定每行输出的元素个数,以 及每个元素占有的列数. 假设自己定义一个参数为x 那么打印的时候printf(""%xd"")怎么用一个参数来满足每次打印时候 元素所占列数的不同呢 解决方案 #include <stdio.h>void display(int data[] int n int cols int w){ for (int i = 0; i < n; i++) { p

c语言-C语言remove函数返回-1

问题描述 C语言remove函数返回-1 在C语言中调用remove函数,调用失败返回的是-1,路径没有问题,请问该怎么办? 解决方案 没人回答吗..是我的权限不够... 解决方案二: 检查一下路径对不对,如果是winxp以上的话,用管理员权限运行你的程序.另外调用int iErr = GetLastError();看看有没有错误码.有的话看看是什么内容.

Go语言里的new函数用法分析_Golang

本文实例讲述了Go语言里的new函数用法.分享给大家供大家参考.具体如下: 表达式 new(T) 分配了一个零初始化的 T 值,并返回指向它的指针. var t *T = new(T) 或 t := new(T) 代码如下: 复制代码 代码如下: package main import "fmt" type Vertex struct {     X, Y int } func main() {     v := new(Vertex)     fmt.Println(v)     v