码迷,mamicode.com
首页 > 编程语言 > 详细

c语言qsort的使用

时间:2020-03-15 20:27:16      阅读:58      评论:0      收藏:0      [点我收藏+]

标签:turn   nts   移植   函数   sign   元素   c语言   rtc   参数   

目的

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

前提

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("\n");
}

c语言qsort的使用

标签:turn   nts   移植   函数   sign   元素   c语言   rtc   参数   

原文地址:https://www.cnblogs.com/vito_wang/p/12499582.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!