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;
    }
     
     
    ========== ======== ======== ======== ===== ==== === == =

       自题小像   鲁迅 

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

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

  • 相关阅读:
    ZOJ 3765 Lights (zju March I)伸展树Splay
    UVA 11922 伸展树Splay 第一题
    UVALive 4794 Sharing Chocolate DP
    ZOJ 3757 Alice and Bod 模拟
    UVALive 3983 捡垃圾的机器人 DP
    UVA 10891 SUM游戏 DP
    poj 1328 Radar Installatio【贪心】
    poj 3264 Balanced Lineup【RMQ-ST查询区间最大最小值之差 +模板应用】
    【转】RMQ-ST算法详解
    poj 3083 Children of the Candy Corn 【条件约束dfs搜索 + bfs搜索】【复习搜索题目一定要看这道题目】
  • 原文地址:https://www.cnblogs.com/asdfknjhu/p/12559519.html
Copyright © 2011-2022 走看看