看正月点灯笼老师的笔记—qsort 和 bsearch
视频地址: https://www.bilibili.com/video/BV1Nx411D7sU
一, qsort 快排
① 头文件 <stdlib.h>
② 函数声明: void qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*))
void* base: 任意类型的数组
size_t: 在系统内部重新定义了 int ,所以 size_t 就是 int
num: 数组的大小
size: 数组里面每个元素的所占字节,即数组的数据类型
int(*compare)(const void*, const void*):函数指针,指向一个比较函数,需要自己写,
其中,若 return 的是一个正数,就把 第一个参数放后面,若 return 的是一个负数就把 第一个参数,放前面。
代码1 int 型数组
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stdlib.h>// void qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*)) int cmp(const void* a, const void* b) { int* pa = (int*)a; int* pb = (int*)b; int num1 = *pa; int num2 = *pb; //return num1 - num2; // 从小到大, return num2 - num1; // 从大到小 } int main(void) { int a[8] = { 1,3,5,7,2,4,6,8 }; qsort(a, 8, sizeof(int), cmp); for (int i = 0; i < 8; i++) { printf("%d ", a[i]); }puts(""); system("pause"); return 0; }
代码2 float 型数组
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stdlib.h>// void qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*)) int cmp(const void* a, const void* b) { float* pa = (float*)a; float* pb = (float*)b; float num1 = *pa; float num2 = *pb; return (int)num1 - num2; // 从小到大,注意类型转换 return (int)num2 - num1; // 从大到小 } int main(void) { float a[8] = { 1,3,5,7,2,4,6,8 }; qsort(a, 8, sizeof(float), cmp); for (int i = 0; i < 8; i++) { printf("%f ", a[i]); }puts(""); system("pause"); return 0; }
代码3,结构体数组,根据学生成绩总分排序
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<stdlib.h> // void qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*)) typedef struct { char name[30]; // 学生姓名 int Chinese; // 语文成绩 int Math; // 数学成绩 int English; // 英语成绩 }st; int cmp(const void* a, const void* b) { st* pa = (st*)a; st* pb = (st*)b; int num1 = pa->Chinese + pa->English + pa->Math; int num2 = pb->Chinese + pb->English + pb->Math; //return (int)num1 - num2; // 从小到大, return (int)num2 - num1; // 从大到小 } int main(void) { st students[7] = { {"周",97,68,45}, {"吴",100,32,88}, {"郑",78,88,78}, {"王",87,90,89}, {"赵",87,77,66}, {"钱",59,68,98}, {"孙",62,73,89} }; qsort(students, 7, sizeof(st), cmp); // 注意区别 students 与 st for (int i = 0; i < 7; i++) { printf("%s%4d%4d%4d\t", students[i].name, students[i].Chinese, students[i].Math, students[i].English); printf("总分:%d\n", students[i].Chinese + students[i].English + students[i].Math); } system("pause"); return 0; }
二, bsearch 二分查找法
① 头文件 <stdlib.h>
② 前提:你所要查找的数组已经排好序,
③ 函数声明: void* bsearch(const void* key, const void* base, size_t num, size_t size, int(*cmp)(const void*, const void*))
key:你所要查找的数组元素,它是:一个具体的 int 变量,你必须定义出来,不能用数值代替
const void* base, size_t num, size_t size:同 qsort
int(*cmp)(const void*, const void*):函数指针,第一个参数是 key,第二个参数是 数组中的元素
④ 这个函数返回值是 指向与你所要查找的数组元素的类型 的指针
代码
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include<stdlib.h> // void qsort(void* base, size_t num, size_t size, int(*compare)(const void*, const void*)) // void* bsearch(const void* key, const void* base, size_t num, size_t size, int(*cmp)(const void*, const void*)) typedef struct { char name[30]; // 学生姓名 int Chinese; // 语文成绩 int Math; // 数学成绩 int English; // 英语成绩 }st; int cmp(const void* a, const void* b) { st* pa = (st*)a; st* pb = (st*)b; int num1 = pa->Chinese + pa->English + pa->Math; int num2 = pb->Chinese + pb->English + pb->Math; //return (int)num1 - num2; // 从小到大, return (int)num2 - num1; // 从大到小 } int compare(const void* key, const void* e) { int * pnum1 = (int*)key; st* ps = (st*)e; int num1 = *pnum1; int num2 = ps->Chinese + ps->English + ps->Math; //return (int)num1 - num2; // 从小到大, return (int)num2 - num1; // 从大到小 } int main(void) { st students[7] = { {"周",97,68,45}, {"吴",100,32,88}, {"郑",78,88,78}, {"王",87,90,89}, {"赵",87,77,66}, {"钱",59,68,98}, {"孙",62,73,89} }; qsort(students, 7, sizeof(st), cmp); // 注意区别 students 与 st int key = 224; st* k = (st*)bsearch(&key, students, 7, sizeof(st), compare); for (int i = 0; i < 7; i++) { printf("%s%4d%4d%4d\t", students[i].name, students[i].Chinese, students[i].Math, students[i].English); printf("总分:%d\n", students[i].Chinese + students[i].English + students[i].Math); } printf("\n你想要查找的学生是:\n"); printf("%s%4d%4d%4d\n", k->name, k->Chinese, k->English, k->Math); system("pause"); return 0; }
三, sort 快排 (来自 百度百科)
① 优点 写起来比 qsort 简单 效率比 qsort 快一点(不要问为什么,问就是不知道)
② sort 函数包含在头文件为 ##nclude<algorithm> 的 c++ 标准库中
③ 参数
bool
cmp(node x,node y)
{
if
(x.a!==y.a)
return
x.a<y.a;
if
(x.b!==y.b)
return
x.b>y.b;
return
x.c>y.c;
}
=
========= ======== ======== ======== ===== ==== === == =自题小像 鲁迅
灵台无计逃神矢,风雨如磐暗故园。
寄意寒星荃不察,我以我血荐轩辕。