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. 浅谈StringBuffer

    StringBuffer,由名字可以看出,是一个String的缓冲区,也就是说一个类似于String的字符串缓冲区,和String不同的是,它可以被修改,而且是线程安全的.StringBuffer在任 ...

  2. LINQ解析

    Linq 是什么? Linq是Language Integrated Query的缩写,即“语言集成查询“的意思,Linq的提出就是为了提供一种跨各种数据源统一查询方式,主要包含四种组件:Linq t ...

  3. 更改npm淘宝源,并设置cnpm

    一.通过命令配置1. 命令 npm config set registry https://registry.npm.taobao.org2. 验证命令 npm config get registry ...

  4. Scale Free Network | 无标度网络

    在看WGCNA的时候看到的一个术语. 先来看一个随机网络:没有中心节点,大部分节点都均匀的连在一起. 再看一下scale free network:大部分的连接都集中在少数的中心 如何检验一个网络是否 ...

  5. Vue mixins(混入)

    建立一个公共组件,然后对该组件进行混入继承. 注意会走两个生命周期,谨慎使用 mixins混入,相当于生成new 组件:组件引用,相当与在父组件内开辟了一块单独的空间 mixins适用于,两个有非常相 ...

  6. 若依项目利用nginx实现负载均衡及保持会话

    记录一下若依项目利用nginx实现负载均衡及保持会话的步骤. 此次作为试验性的测试,为了方便在本地window的环境上实现. 具体步骤: 1.安装两个tomcat8,可以下载一个后,另一个复制即可,下 ...

  7. Linq(一)

    概述 LINQ是.NET框架的扩展,它允许我们以使用SQL查询数据库的方式来查询数据集合. 使用LINQ,你可以从数据库.程序对象集合以及XML文档中查询数据. 需要注意的是,对于比较简单的功能,与其 ...

  8. python -- 约束、异常处理、MD5

    1.类的约束       1.写一个父类,父类中的某个方法要抛出一个异常 NotImplementedError class Base: # 对子类进行了约束,必须重写该方法 def login(se ...

  9. 曾经觉得学习晦涩难懂的我是如何爱上linux的

    2016年冬天,我已经是一名学习计算机科学与技术专业的大三的“老腊肉”了,但是当时的水平依旧平平.就在2016年快要结束的时候,我周围的同学们被一股考研和工作的压力炸开了锅,我也在默默思考着我的人生, ...

  10. vuex-Action(异步)

    Action 类似于 mutation,不同在于: Action 提交的是 mutation,而不是直接变更状态. Action 可以包含任意异步操作. const store = new Vuex. ...