• c语言qsort的使用


    目的

    基于快速排序对数组进行排序,数组元素可以是结构体。

    前提

    qsort属于内置函数,需要包含头文件 stdlib.h

    函数原型

    void qsort( void *ptr, size_t count, size_t size,int (*comp)(const void *, const void *) );
    /**
    void *ptr:空指针, 指向需要排序的数组
    size_t count:数组元素个数,size_t在32位机器上unsigned int(4byte),64位机器上unsigned long(8byte)
    size:数组元素的字节数大小,通常用sizeof()来计算,平台不同,同一类型的变量占据的字节数可能不用,增强可移植性
    int (*comp)(const void *, const void *) : 函数指针,将函数名作为参数,该函数的形参的类型均为const void *,函数外表是一样的,内容却有所不同,返回值类型相同
    **/
    

    用户自定义函数

    指明具体的比较对象

    int cmp(const void *a, const void *b); // 自定义函数内容,若果a值大于b值,返回1,
    {
      /**
    在函数内部将const void* 转换成实际的类型;
    **/
    //默认升序写法
    if ( *(MyType*)a <  *(MyType*)b ) 
        return -1;
    if ( *(MyType*)a == *(MyType*)b ) 
        return 0;
    if ( *(MyType*)a >  *(MyType*)b ) 
        return 1;
    }
    

    结构体排序

    struct Node { 
      int x; 
    }s[100];
    int cmp(const void *a, const void *b); 
    {
    
    if ( (*(Node*)a)->x <  (*(Node*)b)->x ) 
        return -1;
    if ( (*(Node*)a)->x == (*(Node*)b)->x ) 
        return 0;
    if ( (*(Node*)a)->x >  (*(Node*)b)->x ) 
        return 1;
    }
    

    多级排序

    用于结构体内有多个成员时,当x相同时,比较y,以此类推即可。

    struct Node { 
      int x; 
      int y;
      int z; 
    }s[100];
    int cmp(const void *a, const void *b); 
    {
    
    }
    

    调用

    #include <stdio.h>
    #include <stdlib.h>
    #include <limits.h>
     
    int compare_ints(const void* a, const void* b)
    {
        int arg1 = *(const int*)a;
        int arg2 = *(const int*)b;
     
        if (arg1 < arg2) return -1;
        if (arg1 > arg2) return 1;
        return 0;
     
        // return (arg1 > arg2) - (arg1 < arg2); // possible shortcut
        // return arg1 - arg2; // erroneous shortcut (fails if INT_MIN is present)
    }
     
    int main(void)
    {
        int ints[] = { -2, 99, 0, -743, 2, INT_MIN, 4 };
        int size = sizeof ints / sizeof *ints;
     
        qsort(ints, size, sizeof(int), compare_ints);
     
        for (int i = 0; i < size; i++) {
            printf("%d ", ints[i]);
        }
     
        printf("
    ");
    }
    
  • 相关阅读:
    推荐一个SAM文件中flag含义解释工具--转载
    字节码技术
    Jconsole工具检测堆内存变化的使用
    观察者模式
    装饰器模式(IO流案例)
    JVM垃圾收集器
    内存溢出与内存泄漏区别
    栈溢出
    内存溢出
    JVM参数调优
  • 原文地址:https://www.cnblogs.com/vito_wang/p/12499582.html
Copyright © 2020-2023  润新知