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. vue--实例化对象

    根目录下的文件,这些是创建vue项目时生成的配置文件 node_modules=> 里面的文件是项目开发过种中的各种依赖,我们暂且不用去深入了解: public=> 主要放的是一些公用的文 ...

  2. robot framework测试数据语法

    Robot Framework通过文件的扩展名来选择使用何种解析器. 扩展名不分大小写. 可以识别的扩展名包括: HTML: .html, .htm 和 .xhtml TSV: .tsv 纯文本: . ...

  3. windows2012安装

    windows server 2012 r2 安装无法找到install.wim 错误代码0x80070026,以及制作U启动盘决解ISO文件超过5G大小限制的解决方案关于在服务器上安装windows ...

  4. eclipse 运行 mapreduce程序报错 No job jar file set. User classes may not be found. See JobConf(Class) or JobConf#setJar(String).

    报错信息 17/07/06 17:00:27 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Ap ...

  5. ABBYY Cup 3.0G3. Good Substrings

    题意:定义一个串合法,在n个串中出现次数在li到ri中.问s的所有本质的子串有是多少合法的 题解:把所有串用分隔符分开建sam,记录一个该节点对应每个串的出现次数,topo排序后,当该节点s出现次数不 ...

  6. 在Eclipse下搭建Hibernate框架(加载hibernate工具插件,离线)

    下载hibernate工具包完成之后,对其进行解压可以得到众多文件夹,其中就有一个jbosstools-hibernate开头的文件夹,进入其中可以得到features和plugins两个文件夹,在E ...

  7. MySQL三层循环

    begindeclare i int;  #定义i变量declare j int;  #定义j变量declare k int;  #定义k变量set i=1;set j=1;set k=1;while ...

  8. mqtt------ mosca服务器端参数简介

    一:服务器端 为什么使用mosca:mosca是基于node.js开发,上手难度相对较小,其次协议支持完整,除了不支持Qos 2,其它的基本都支持.持久化支持redis以及mongo.二次开发接口简单 ...

  9. vim 插件 -- NERDTree

    介绍 NERDTree 插件就是使vim编辑器有目录效果. 所谓无图无真相,所以直接看这个插件的效果图吧. 下载 https://www.vim.org/scripts/script.php?scri ...

  10. python ----元组方法以及修改细节

    元组的一级元素不可修改 #元组,有序 tu = (111,"alex",(11,22),[(33,44)],True,33,44,) v = tu[3][0][0] print(v ...