zoukankan      html  css  js  c++  java
  • 看正月点灯笼老师的笔记—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	", students[i].name, students[i].Chinese, students[i].Math, students[i].English);
            printf("总分:%d
    ", 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	", students[i].name, students[i].Chinese, students[i].Math, students[i].English);
            printf("总分:%d
    ", students[i].Chinese + students[i].English + students[i].Math);
        }
        printf("
    你想要查找的学生是:
    ");
        printf("%s%4d%4d%4d
    ", 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;
    }
     
     
    ========== ======== ======== ======== ===== ==== === == =

       自题小像   鲁迅 

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

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

  • 相关阅读:
    Python 之pymysql数据库模块
    Python 之sqlite3数据库模块
    Python 之操作sqlite3
    Python 之requests网络请求模块
    Python 之os文件目录模块
    Python 之json模块
    Python 之random随机数模块
    vue.js三种安装方式
    VUE学习之计算属性computed
    vue添加背景音乐
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12559519.html
Copyright © 2011-2022 走看看