看正月点灯笼老师的笔记—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++ 标准库中

③ 参数

sort(start,end,cmp)
(1)start:表示要排序数组的起始地址;
(2)end:表示数组结束地址的下一位;
(3)cmp:用于规定排序的方法,可不填,默认升序。
④举例
有一个node类型的数组node arr[100],想对它进行排序:先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按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;
}
 
 
========== ======== ======== ======== ===== ==== === == =

   自题小像   鲁迅 

灵台无计逃神矢,风雨如磐暗故园。

寄意寒星荃不察,我以我血荐轩辕。

 

posted @ 2020-03-24 15:58  叫我妖道  阅读(641)  评论(0编辑  收藏  举报
~~加载中~~