排序方法有很多种:选择排序,冒泡排序,归并排序,快速排序等。 看名字都知道快速排序是目前公认的一种比较好的排序算法。因为他速度很快,所以系统也在库里实现这个算法,便于我们的使用。 这就是qsort函数(全称quicksort)。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)
功能: 使用快速排序例程进行排序
头文件:stdlib.h
用法: void qsort(void* base,size_t num,size_t width,int(__cdecl*compare)(const void*,const void*));
参数: 1 待排序数组,排序之后的结果仍放在这个数组中
2 数组中待排序元素数量
3 各元素的占用空间大小(单位为字节)
4 指向函数的指针,用于确定排序的顺序(需要用户自定义一个比较函数)
qsort要求提供一个自己定义的比较函数。比较函数使得qsort通用性更好,有了比较函数qsort可以实现对数组、字符串、结构体等结构进行升序或降序排序。
如比较函数 int cmp(const void *a, const void *b) 中有两个元素作为参数(参数的格式不能变),返回一个int值,比较函数cmp的作用就是给qsort指明元素的大小是怎么比较的。
//头文件包含
#include<stdlib.h>
#include<stdio.h>
#include<malloc.h>
#include <string.h>
#include <string>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INFEASIBLE -2
#define maxn 100005
typedef struct student {
char name[10], id[10];
int score;
}student;
int cmp(const void * a, const void * b) {//固定 强转
student *aa = (student*)a;
student *bb = (student*)b;
return strcmp(aa->id, bb->id);
}
int cmp2(const void *a, const void *b) {
student *aa = (student*)a;
student *bb = (student*)b;
int rel = strcmp(aa->name, bb->name);
if (!rel) return strcmp(aa->id, bb->id);
return rel;
}
int cmp3(const void *a, const void *b) {
student *aa = (student*)a;
student *bb = (student*)b;
int rel = aa->score - bb->score;//如果是>比较的话 会出现问题
//printf("%d\n",rel);//a<b 得出的是0 但是事实是不能比较 所以会报错
if (!rel) return strcmp(aa->id, bb->id);
return rel;
}
int main()
{
int num; scanf("%d", &num);
student* stu = (student *)malloc(sizeof(student)*num);
int c; scanf("%d", &c);
for (int i = 0; i < num; i++) {
scanf("%s %s %d", stu[i].id, stu[i].name,& stu[i].score);
}
switch (c) {
case 1:{
qsort(stu, num, sizeof(student), cmp);
break;
}
case 2:{
qsort(stu, num, sizeof(student), cmp2);
break;
}
case 3:{
qsort(stu, num, sizeof(student), cmp3);
break;
}
}
for (int i = 0; i < num; i++) {
printf("%s %s %d\n", stu[i].id, stu[i].name, stu[i].score);
}
system("pause");
return 0;
}