qsort函数排序各种类型的数据。

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 的使用

 1 /* qsort example */
 2 #include <stdio.h>      /* printf */
 3 #include <stdlib.h>     /* qsort */
 4
 5 int values[] = { 40, 10, 100, 90, 20, 25 };
 6
 7 int compare (const void * a, const void * b)
 8 {
 9   return ( *(int*)a - *(int*)b );
10 }
11
12 int main ()
13 {
14   int n;
15   qsort (values, 6, sizeof(int), compare);
16   for (n=0; n<6; n++)
17   printf ("%d ",values[n]);
18   return 0;
19 }

1.对 int 类型的数组排序

 1 //qsort函数
 2 #include <stdio.h>
 3 #include<stdlib.h>
 4 //qsort函数实现int型排序
 5 //qosrt函数的使用者得实现一个比较函数
 6 int int_cmp(const void * p1, const void * p2)
 7 {
 8     return (*( int *)p1 - *(int *) p2);
 9 }
10
11 int main()
12 {
13     int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
14     qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
15     for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
16     {
17         printf("%d ", arr[i]);
18     }
19     printf("\n");
20     return 0;
21 }

2.对 char 类型的数组排序

 1 //qosrt函数实现char型排序
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 int char_cmp(const void* str1, const void* str2)
 5 {
 6     return *(char*)str1 - *(char*)str2;
 7 }
 8
 9 int main()
10 {
11     char str[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
12     qsort(str, sizeof(str) / sizeof(str[0]), sizeof(char), char_cmp);
13     for (int i = 0; i < sizeof(str) / sizeof(str[0]); ++i)
14     {
15         printf("%d ", str[i]);
16     }
17
18     return 0;
19 }

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

 1 //qosrt函数实现double型排序
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 int double_cmp(const void* arr1, const void* arr2)
 5 {
 6     return *(double*)arr1 > *(double*)arr2 ? 1 : -1;
 7     //注意这里是用比较大小的方法,来返回正负
 8 }
 9
10 int main()
11 {
12     double arr[] = { 1.4, 3.9, 5.4, 5.2, 9, 2, 4, 6, 8, 0 };
13     qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(double), double_cmp);
14     for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); ++i)
15     {
16         printf("%f ", arr[i]);
17     }
18
19     return 0;
20 }

4.对结构体一级排序

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 typedef struct Student
 5 {
 6     int x;
 7     int y;
 8     //按照x从小到大排序,当x相等时按照y从大到小排序
 9 }Student;
10
11 Student student[7];
12
13 int cmp(const void *a, const void *b)
14 {
15     Student* pa1 = (Student*)a;
16     Student* pa2 = (Student*)b;
17
18     return (pa1->x) > (pa2->x) ? 1 : -1;
19 }
20
21 //展示一下对于结构体里赋值的后的结果
22 void Display()
23 {
24     for (int i = 0; i < 7; ++i)
25     {
26         printf("%d\n",student[i].x);
27     }
28 }
29
30 int main()
31 {
32     int arr[7] = { 1,3,5,2,6,9,7 };
33     for (int i = 0; i < 7; ++i)
34     {
35         //将数组arr中的元素赋值给结构体x中
36         student[i].x = arr[i];
37     }
38     Display();
39     qsort(student, 7, sizeof(Student), cmp);
40     for (int i = 0; i < 7; ++i)
41     {
42         printf("%d", student[i].x);
43     }
44
45     return 0;
46 }

5.对机构体二级的排序

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

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

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 typedef struct Student
 5 {
 6     int x;
 7     int y;
 8     //按照x从小到大排序,当x相等时按照y从大到小排序
 9 }Student;
10
11 Student student[7];
12
13 int cmp(const void *a, const void *b)
14 {
15     Student* pa1 = (Student*)a;
16     Student* pa2 = (Student*)b;
17
18     if (pa1->x != pa2->x)
19     {
20         return (pa1->x) > (pa2->x) ? 1 : -1;
21     }
22     else
23     {
24         return (pa1->y) > (pa2->y) ? 1 : -1;
25     }
26 }
27
28 //展示一下对于结构体里赋值的后的结果
29 void Display()
30 {
31     printf("x=");
32     for (int i = 0; i < 7; ++i)
33     {
34         printf("%d", student[i].x);
35     }
36     printf("\n");
37     printf("y=");
38     for (int i = 0; i < 7; ++i)
39     {
40         printf("%d", student[i].y);
41     }
42     printf("\n");
43 }
44
45 int main()
46 {
47     int arr[7] = { 1,3,5,2,6,9,7 };
48     for (int i = 0; i < 7; ++i)
49     {
50         //将数组arr中的元素赋值给结构体x中
51         student[i].y = arr[i];
52     }
53     Display();
54     printf("排序结构体中的y:\n");
55     qsort(student, 7, sizeof(Student), cmp);
56     for (int i = 0; i < 7; ++i)
57     {
58         printf("%d", student[i].y);
59     }
60
61     return 0;
62 }

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

原文地址:https://www.cnblogs.com/cuckoo-/p/10469995.html

时间: 2024-07-31 17:43:47

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

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

一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ){return *(int *)a - *(int *)b;} qsort(num,100,sizeof(num[0]),cmp); 二.对char类型数组排序(同int类型) char word[100]; int cmp( const void *a , const void *b ){return *(char *)a - *(int *)b;} qsor

C语言中qsort函数用法

C语言中qsort函数用法-示例分析  本文实例汇总介绍了C语言中qsort函数用法,包括针对各种数据类型参数的排序,非常具有实用价值非常具有实用价值. 分享给大家供大家参考.C语言中的qsort函数包含在<stdlib.h>的头文件里,本文中排序都是采用的从小到大排序. 一.对int类型数组排序 int num[100]; int cmp ( const void *a , const void *b ) { return *(int *)a - *(int *)b; } qsort(num

qsort 函数的使用——对普通数组、指针数组、二维数组中的元素进行排序

在ANSI C中,qsort函数的原型是 #include <stdlib.h> void qsort(void *base, size_t nmemb, size_t size, int (*compar) (const void *, const void *)); 解释:qsort函数对含有nmemb个元素的数组进行排序,而base指针指向数组的第一个元素.这个数组的元素个数由size指定. compar函数对qsort的比较操作进行定义,所以可以定制数字的比较,字符串的比较,甚至结构体

【电话号码排序--简单 qsort函数】

Phone List Time Limit: 2 Sec  Memory Limit: 64 MB Submit: 359  Solved: 79 [Submit][Status][Discuss] Description Given a list of phone numbers, determine if it is consistent in the sense that no number is the prefix of another. Let's say the phone cat

【C/C++学院】0814-引用高级、引用高级增加/auto自动变量自动根据类型创建数据/Bool/Enum/newdelete全局/大数据乘法与结构体/函数模板与auto/宽字符本地化/inline

引用高级.引用高级增加 #include<iostream> #include<stdlib.h> // int a[10] // int (&ra)[10] // int a[2][5] // int (&ra)[2][5] void main1() { int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int(&ra)[10](a);//引用就是给原来的变量有一个别名同一个地址 int i = 0; for (

qsort函数用法

原文链接http://www.cnblogs.com/syxchina/archive/2010/07/29/2197382.html qsort 功 能: 使用快速排序例程进行排序  用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 用于确定排序的顺序 排序方法有

【转】qsort函数用法

qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针 用于确定排序的顺序 排序方法有很多种, 选择排序,冒泡排序,归并排序,快速排序等. 看名字都知道快速排序 是目前公认的一种比较好的排序算法(我没听书速度比这快的了,特殊

qsort函数以及sort函数使用方法

?? sort函数的使用方法 做ACM题的时候,排序是一种常常要用到的操作. 假设每次都自己写个冒泡之类的O(n^2)排序,不但程序easy超时,并且浪费宝贵的比赛时间,还非常有可能写错. STL里面有个sort函数,能够直接对数组排序,复杂度为n*log2(n).使用这个函数.须要包括头文件. 这个函数能够传两个參数或三个參数. 第一个參数是要排序的区间首地址,第二个參数是区间尾地址的下一地址.也就是说.排序的区间是[a,b).简单来说,有一个数组int a[100].要对从a[0]到a[99

qsort函数、sort函数 (精心整理篇)

先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 具体介绍:-^^ void qsort( void *base, size_t n