qsort函数是库函数中的一员,我们先来看看官方文档是怎么写的:

其中qsort的参数void* base是传入一个数组,size_t num 为数组整体大小,size_t size 为单个元素的大小,int (*compar)(const void*,const void*)是需要使用者去完成的一个比较函数

针对这个函数,在不同类型的数组中需要用不同的处理方式,来保证数组中的元素大小不会失真(例如在处理double型的数组时就需要用不同的方式来进行)

比较函数的返回值是;

return value meaning
<0 The element pointed to by p1 goes before the element pointed to by p2
0 The element pointed to by p1 is equivalent to the element pointed to by p2
>0 The element pointed to by p1 goes after the element pointed to by p2

我们来看一个例子:这是官方文档为我们提供的一个例子:关于对 qsort 的使用

 /* qsort example */
#include <stdio.h> /* printf */
#include <stdlib.h> /* qsort */ int values[] = { , , , , , }; int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
} int main ()
{
int n;
qsort (values, , sizeof(int), compare);
for (n=; n<; n++)
printf ("%d ",values[n]);
return ;
}

1.对 int 类型的数组排序

 //qsort函数
#include <stdio.h>
#include<stdlib.h>
//qsort函数实现int型排序
//qosrt函数的使用者得实现一个比较函数
int int_cmp(const void * p1, const void * p2)
{
return (*( int *)p1 - *(int *) p2);
} int main()
{
int arr[] = { , , , , , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(int), int_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); i++)
{
printf("%d ", arr[i]);
}
printf("\n");
return ;
}

2.对 char 类型的数组排序

 //qosrt函数实现char型排序
#include<stdio.h>
#include<stdlib.h>
int char_cmp(const void* str1, const void* str2)
{
return *(char*)str1 - *(char*)str2;
} int main()
{
char str[] = { , , , , , , , , , };
qsort(str, sizeof(str) / sizeof(str[]), sizeof(char), char_cmp);
for (int i = ; i < sizeof(str) / sizeof(str[]); ++i)
{
printf("%d ", str[i]);
} return ;
}

3.对 double 类型数组排序(需要特别注意)

 //qosrt函数实现double型排序
#include<stdio.h>
#include<stdlib.h>
int double_cmp(const void* arr1, const void* arr2)
{
return *(double*)arr1 > *(double*)arr2 ? : -;
//注意这里是用比较大小的方法,来返回正负
} int main()
{
double arr[] = { 1.4, 3.9, 5.4, 5.2, , , , , , };
qsort(arr, sizeof(arr) / sizeof(arr[]), sizeof(double), double_cmp);
for (int i = ; i < sizeof(arr) / sizeof(arr[]); ++i)
{
printf("%f ", arr[i]);
} return ;
}

4.对结构体一级排序

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; return (pa1->x) > (pa2->x) ? : -;
} //展示一下对于结构体里赋值的后的结果
void Display()
{
for (int i = ; i < ; ++i)
{
printf("%d\n",student[i].x);
}
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].x = arr[i];
}
Display();
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
} return ;
}

5.对机构体二级的排序

就对于4中的结构体来说,如果给x赋值,则x中的值都为0,那么就需要来比较y中的数组。

则可以将代码改为下面这样:

 #include<stdio.h>
#include<stdlib.h> typedef struct Student
{
int x;
int y;
//按照x从小到大排序,当x相等时按照y从大到小排序
}Student; Student student[]; int cmp(const void *a, const void *b)
{
Student* pa1 = (Student*)a;
Student* pa2 = (Student*)b; if (pa1->x != pa2->x)
{
return (pa1->x) > (pa2->x) ? : -;
}
else
{
return (pa1->y) > (pa2->y) ? : -;
}
} //展示一下对于结构体里赋值的后的结果
void Display()
{
printf("x=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].x);
}
printf("\n");
printf("y=");
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
}
printf("\n");
} int main()
{
int arr[] = { ,,,,,, };
for (int i = ; i < ; ++i)
{
//将数组arr中的元素赋值给结构体x中
student[i].y = arr[i];
}
Display();
printf("排序结构体中的y:\n");
qsort(student, , sizeof(Student), cmp);
for (int i = ; i < ; ++i)
{
printf("%d", student[i].y);
} return ;
}

6.模仿qsort的功能实现一个通用的冒泡排序

 //用回调函数模拟实现qsort(冒泡排序的方式)

 #include <stdio.h>

 int int_cmp(const void * p1, const void * p2)
{
return (*(int *)p1 > *(int *)p2);
} void _swap(void *p1, void * p2, int size)
{
int i = ;
for (i = ; i < size; i++)
{
char tmp = *((char *)p1 + i);
*((char *)p1 + i) = *((char *)p2 + i);
*((char *)p2 + i) = tmp;
}
} void bubble(void *base, int count, int size, int(*cmp)(void *, void *))
{
int i = ;
int j = ;
for (i = ; i < count - ; i++)
{
for (j = ; j < count - i - ; j++)
{
if (cmp((char *)base + j * size, (char *)base + (j + )*size) > )
{
_swap((char *)base + j * size, (char *)base + (j + )*size, size);
}
}
}
}
int main() {
int arr[] = { , , , , , , , , , };
//char *arr[] = {"aaaa","dddd","cccc","bbbb"};    
int i = ;
bubble(arr, sizeof(arr) / sizeof(arr[]), sizeof (int), int_cmp);
for (i = ; i< sizeof(arr) / sizeof(arr[]); i++)
{
printf( "%d ", arr[i]);
}
printf("\n");
return ;
}

qsort函数排序各种类型的数据。的更多相关文章

  1. QSort函数对不同类型数据快速排序浅谈

    一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;} ...

  2. 【C/C++】qsort函数的使用方法和细节

    函数概述 qsort 为quick_sort的简写,意为快速排序,主要用于对各种数组的排序. 因为数组的元素可能是任何类型的,甚至是结构或者联合,所以必须高数函数qsort如何确定两个数组元素哪一个& ...

  3. C语言中qsort函数用法

    C语言中qsort函数用法-示例分析    本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort ...

  4. 使用C语言中qsort()函数对浮点型数组无法成功排序的问题

    一 写在开头 1.1 本节内容 本节主要内容是有关C语言中qsort()函数的探讨. 二 问题和相应解决方法 qsort()是C标准库中的一个通用的排序函数.它既能对整型数据进行排序也能对浮点型数据进 ...

  5. Mysql order by 排序 varchar 类型数据

    Mysql order by 排序 varchar 类型数据 varchar 类型字段排序,  会將数字当成字符串来处理.  排序规则一般是从左到右一位位来比较. +0之后 就转化成INT 类型排序 ...

  6. qsort函数、sort函数【转】

    http://blog.163.com/yuhua_kui/blog/static/9679964420142195442766/ 先说明一下:qsort和sort,只能对连续内存的数据进行排序,像链 ...

  7. C中的qsort函数和C++中的sort函数的理解与使用

    一.qsort()函数 原型:_CRTIMP void __cdecl qsort (void*, size_t, size_t,int (*)(const void*, const void*)); ...

  8. qsort函数用法【转】

    qsort函数用法 qsort 功 能: 使用快速排序例程进行排序  用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(con ...

  9. qsort函数用法

    qsort函数用法   qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(co ...

随机推荐

  1. 在input中输入需要的数据,使用qrcode,点击生成二维码

    话不多说直接上代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type&quo ...

  2. postman(八):使用newman来执行postman脚本

    通过之前的了解,我们知道postman是基于javascript语言编写的,而导出的json格式的postman脚本也无法直接在服务器运行,它需要在newman中执行(可以把newman看做postm ...

  3. 《SQL 基础教程》第二章:查询基础

    这一章的结构如下: SELECT 语句基础 算术运算符和比较运算符 逻辑运算符 SELECT 语句可用于查询数据,并且可以设定条件来查询具有特定值的记录.条件的设定就需要算数运算符.比较运算符和逻辑运 ...

  4. vue分页控件

    下载:https://pan.baidu.com/s/1c125Vgc 一个简单的分页控件: 自动加载模式: 手动加载模式: loading图标使用了iconfont: 主要方法: beginRefr ...

  5. ES6 4个方法

    var string = 'Yo' string.startsWith('Y')        -> true      startsWith()查找字符串是否是以某一个字段开始的 string ...

  6. composer修改成国内镜像

    因为composer安装包数据是从github.com上下载的,安装包的元数据从packagist.org上下载 作为两个国外的网站,连接速度会很慢,而且很有可能网站被墙. 所以composer中国全 ...

  7. linux下NFS实战

    系统环境 系统平台:CentOS release 6.8 (Final) NFS Server IP:172.16.55.6 防火墙关闭 SELinux=disabled 安装NFS程序包 1.查看系 ...

  8. Vue项目在真机测试

    一:修改config 找到config文件夹下的index.js文件并修改为: module.exports = { dev: { host: '0.0.0.0' // 原为: hotst: 'loc ...

  9. 在 .NET项目中使用 Redis(2018.10.16)

    1. 打开NuGet管理器搜索redis,安装:“StackExchange.Redis” 2. 配置 Web.config 文件 <connectionStrings> <add ...

  10. Liblinear and Libsvm-rank训练数据的bash代码

    Liblinear and Libsvm-rank训练数据的bash代码: for j in "amazon_mp3" "video_surveillance" ...