目录
听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧
在了解基本的冒泡法,选择法之后,我们知道这两种方法只能排序单一类型数据,如果是多种类型的话,则感到无力,接下来我们将介绍一种更高效的方法---快速排序qsort
使用cpplusplus,c/c++官方网站
??
由上面得知
void qsort(void *base, //指向需要排序的数组的第一个元素
size_t num,//排序的元素个数
size_t size //一个元素的大小,单位是字节
int (*cmp)(const void *p1,const void *p2)//函数指针类型--这个函数指针指向的函数,能够比较base指向数组中的两个元素
特别注意:void *的指针为无具体类型的指针,可以接收任意类型的地址,不能直接解引用的,也不能直接进
行指针计算的需要强制转换为需要的类型
(1)快速排序的方法
(2)适合于任意类型数据的排序
(3)默认是升序排序
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#define N 5
int com(const void* p1, const void* p2)
{
return (*(int*)p1 - *(int*)p2);//降序的话则改为 return (*(int*)p2-*(int*)p1);
}
int main()
{
int a[N] = { 0 };
int i = 0;
for (i = 0; i < N; i++)
{
scanf("%d", &a[i]);
}
qsort(a, N, sizeof(a[0]), com);
for (i = 0; i < N; i++)
{
printf("%d ", a[i]);
}
return 0;
}
??
降序排序的话则如上改动就行?
#include <stdio.h>
#include <stdlib.h>
#define N 3
struct Student
{
int num;//学号
char name[20];//姓名
};
int com_num(const void* p1, const void* p2)
{
return ((struct Student *)p1)->num-((struct Student *)p2)->num;
}
int main()
{
struct Student s[N];
int i = 0;
for (i = 0; i < N; i++)
{
scanf("%d%s", &s[i].num, s[i].name);
}
qsort(s, N, sizeof(s[0]), com_num);//学号比较
for (i = 0; i < N; i++)
{
printf("%5d%8s\n", s[i].num, s[i].name);
}
return 0;
}
?程序结果为
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 3
struct Student
{
int num;//学号
char name[20];//姓名
};
int com_name(const void* p1, const void* p2)
{
return strcmp(((struct Student*)p1)->name, ((struct Student*)p2)->name);
}
int main()
{
struct Student s[N];
int i = 0;
for (i = 0; i < N; i++)
{
scanf("%d%s", &s[i].num, s[i].name);
}
qsort(s, N, sizeof(s[0]), com_name);//姓名比较
for (i = 0; i < N; i++)
{
printf("%5d%8s\n", s[i].num, s[i].name);
}
return 0;
}
程序运行结果为?