通过洛谷的一道题,知道了qsort函数,
上题
这个题如果用快排,那就非常简单,那么问题来了,快排是什么?
进入正题:
首先他的函数:
void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
一、初识qsort
1.base 是首元素的地址,数组名;可以看到他写的时void*,意思时表达这里可以传递任意类型的数组;
2.num是 需要排序的元素个数,数组的大小;
3.size是元素的大小;(qsort是可以排序任意数据类型的数据,用void来接收。但之后需要对他进行强制类型转换)
4.compar是要比较的两个元素,这里只需要填函数名即可;
5.该函数时包含在<stdlib.h>,所以在使用时要写出他的头文件。
二、核心——函数
函数的核心在于写出后边需要比较的部分。
举个比较整形数组的例子:
上代码(别急后边会分开说明)
#include <stdlib.h>
#include <stdio.h>
int cmp_int(const void* _a, const void* _b)
{
int* a = (int*)_a;
int* b = (int*)_b;
return *a - *b;
}
int main() {
int arr[] = {1,0,8,6};
printf("排序前:");
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
{
printf("%d ",arr[i]);
}
qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_int);
printf("\n排序后:");
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); ++i)
{
printf("%d ",arr[i]);
}
}
先看函数的引用,即
qsort(arr,sizeof(arr)/sizeof(arr[0]) ,sizeof(arr[0]), cmp_int);
这一部分,有四部分,①数组名即首地址②数组的大小③元素的大小④函数;
再看④中的函数
int cmp_int(const void* _a, const void* _b)
{
int* a = (int*)_a;
int* b = (int*)_b;
return *a - *b;
}
函数首部的a也是void*表示它可以接收任何类型的元素。因为是对整形数组排序,所以对其强制转换后,相减返回一个>0或<0或=0;即可判断大小。
那么他的运行结果为
那么如果对浮点型数据排序呢?
很简答只需要在转换类型时,将其转换为float或者double。那么在相减的时候,
return *a - *b;
这个地方将会冲突,那么我们就需要直接对其判断大小
int inc (const void * a, const void * b)
{
return *(double *)a > *(double *)b ? 1 : -1;
}
当前>后值为1,否则为-1;
当然也可以对字符型,字符和整形就没有太大区别了。
再回到最开头,去解决“奖学金”,这个题目时对结构体进行排序。
代码又又又又来了
#include<stdio.h>
#include<stdlib.h>
struct stu
{
int num;
int a,b,c;
int sum;
};
int cmp(const void *a,const void *b)
{
int t1=(*(struct stu*)b).sum-(*(struct stu *)a).sum;
if(t1==0)
{
int t2=(*(struct stu*)b).a-(*(struct stu *)a).a;
if(t2==0)
{
return (*(struct stu *)a).num - (*(struct stu *)a).num;
}
else return t2;}
else return t1;
}
int main()
{
int n;
scanf("%d",&n);
struct stu a[n];
for(int i=0;i<n;i++)
{
scanf("%d %d %d",&a[i].a,&a[i].b,&a[i].c);
a[i].sum=a[i].a+a[i].b+a[i].c;
a[i].num=i+1;
}
qsort(a,n,sizeof(a[0]),cmp);
for(int i=0;i<5;i++)
{
printf("%d %d",a[i].num,a[i].sum);
printf("\n");
}
return 0;
}
与整形数组相比最大差别就在最后的函数那里。,先比较总成绩,再依次语文,数学。
到此qsort先结束了;
初始qsort,所以所以......
我以后还没来补充的,当然还有其它几种经典排序。