zoukankan      html  css  js  c++  java
  • qsort / bsearch

    qsort bsearch

    include <stdlib.h>

    void qsort (void* base, size_t num, size_t size,
                int (*compar)(const void*,const void*));
    
    //第一个参数	数组
    //第二个参数 数组大小
    //第三个参数 元素大小
    //第四个参数 函数
    
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct {
        char name[30];
        int Chinese;
        int Math;
        int English;
    } Student;
    
    Student students[7];
    
    void readData() {
        FILE* file = fopen("mark.txt", "r");
        int i;
        for (i = 0; i < 7; i++) {
            fscanf(file, "%s", students[i].name);
            fscanf(file, "%d", &students[i].Chinese);
            fscanf(file, "%d", &students[i].Math);
            fscanf(file, "%d", &students[i].English);
        }
        fclose(file);
    }
    
    void displayData() {
        int i;
        for (i = 0; i < 7; i++) {
            printf("%s	", students[i].name);
            printf("%d	", students[i].Chinese);
            printf("%d	", students[i].Math);
            printf("%d
    ", students[i].English);
        }
    }
    int compare(const void* a, const void* b) {
        Student* pa = (Student *)a;
        Student* pb = (Student *)b;
        int num1 = pa->Chinese;
        int num2 = pb->Chinese;
        return num2 - num1;
    }
    
    int main(void) {
    
        readData();
        qsort(students, 7, sizeof(Student), compare);
        displayData();
        return 0;
    }
    
    //mark.txt
    Tom 97 68 45
    Jerry 100 32 88
    Harry 78 88 78
    Lucy 87 90 89
    Mickey 88 77 66
    Peter 59 68 98
    Alice 62 73 89
    
    /* !< output */
    
    //按语文成绩排序
    Jerry   100     32      88
    Tom     97      68      45
    Mickey  88      77      66
    Lucy    87      90      89
    Harry   78      88      78
    Alice   62      73      89
    Peter   59      68      98
    
    Process returned 0 (0x0)   execution time : 0.006 s
    Press any key to continue.
    
    /* qsort example */
    #include <stdio.h>      /* printf */
    #include <stdlib.h>     /* qsort */
    
    int values[] = { 40, 10, 100, 90, 20, 25 };
    
    int compare (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    
    int main ()
    {
      int n;
      qsort (values, 6, sizeof(int), compare);
      for (n=0; n<6; n++)
         printf ("%d ",values[n]);
      return 0;
    }
    

    bsearch

    void* bsearch (const void* key, const void* base,
                   size_t num, size_t size,
                   int (*compar)(const void*,const void*));
    
    #include <stdlib.h>
    #include <stdio.h>
    
    typedef struct {
        char name[30];
        int Chinese;
        int Math;
        int English;
    } Student;
    
    Student students[7];
    
    void readData() {
        FILE* file = fopen("mark.txt", "r");
        int i;
        for (i = 0; i < 7; i++) {
            fscanf(file, "%s", students[i].name);
            fscanf(file, "%d", &students[i].Chinese);
            fscanf(file, "%d", &students[i].Math);
            fscanf(file, "%d", &students[i].English);
        }
        fclose(file);
    }
    
    void displayData() {
        int i;
        for (i = 0; i < 7; i++) {
            printf("%s	", students[i].name);
            printf("%d	", students[i].Chinese);
            printf("%d	", students[i].Math);
            printf("%d	", students[i].English);
            printf("%d
    ", students[i].Chinese + students[i].Math + students[i].English);
        }
    }
    int compare(const void* a, const void* b) {
        Student* pa = (Student *)a;
        Student* pb = (Student *)b;
        int num1 = pa->Chinese + pa->Math + pa->English;
        int num2 = pb->Chinese + pb->Math + pb->English;
        return num2 - num1;
    }
    
    int compare2(const void* key, const void* e) {
        int* pNum1 = (int *)key;
        Student* pS = (Student *)e;
        int num1 = *pNum1;
        int num2 = pS->Math + pS->Chinese + pS->English;
        return num2 - num1;
    }
    
    int main(void) {
    
        readData();
        qsort(students, 7, sizeof(Student), compare);
        int key = 224;
        Student* s = bsearch(&key, students, 7, sizeof(Student), compare2);
        printf("%s
    ", s->name);
        displayData();
        return 0;
    }
    /* output */
    /* !< 寻找总分为224的人 */
    Alice
    Lucy    87      90      89      266
    Harry   78      88      78      244
    Mickey  88      77      66      231
    Peter   59      68      98      225
    Alice   62      73      89      224
    Jerry   100     32      88      220
    Tom     97      68      45      210
    
    Process returned 0 (0x0)   execution time : 0.005 s
    Press any key to continue.
    
    
    /* bsearch example */
    #include <stdio.h>      /* printf */
    #include <stdlib.h>     /* qsort, bsearch, NULL */
    
    int compareints (const void * a, const void * b)
    {
      return ( *(int*)a - *(int*)b );
    }
    
    int values[] = { 50, 20, 60, 40, 10, 30 };
    
    int main ()
    {
      int * pItem;
      int key = 40;
      qsort (values, 6, sizeof (int), compareints);
      pItem = (int*) bsearch (&key, values, 6, sizeof (int), compareints);
      if (pItem!=NULL)
        printf ("%d is in the array.
    ",*pItem);
      else
        printf ("%d is not in the array.
    ",key);
      return 0;
    }
    
    /* bsearch example with strings */
    #include <stdio.h>      /* printf */
    #include <stdlib.h>     /* qsort, bsearch, NULL */
    #include <string.h>     /* strcmp */
    
    char strvalues[][20] = {"some","example","strings","here"};
    
    int main ()
    {
      char * pItem;
      char key[20] = "example";
    
      /* sort elements in array: */
      qsort (strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);
    
      /* search for the key: */
      pItem = (char*) bsearch (key, strvalues, 4, 20, (int(*)(const void*,const void*)) strcmp);
    
      if (pItem!=NULL)
        printf ("%s is in the array.
    ",pItem);
      else
        printf ("%s is not in the array.
    ",key);
      return 0;
    }
    

    reference

    http://www.cplusplus.com/info/

  • 相关阅读:
    【BZOJ】2019: [Usaco2009 Nov]找工作(spfa)
    【BZOJ】3668: [Noi2014]起床困难综合症(暴力)
    Redis 字符串结构和常用命令
    Redis实现存取数据+数据存取
    Spring 使用RedisTemplate操作Redis
    使用 java替换web项目的web.xml
    SQL server 从创建数据库到查询数据的简单操作
    SQL server 安装教程
    IntelliJ IDEA 注册码(因为之前的地址被封杀了,所以换了个地址)
    对程序员有帮助的几个非技术实用链接(点我,你不会后悔的)
  • 原文地址:https://www.cnblogs.com/xzpin/p/11494266.html
Copyright © 2011-2022 走看看