在OJ时, 可能会使用到排序的情形. 如果是使用C语言, <stdlib.h>中已经有相关的排序函数的, 直接用就行.

下面以qsort为例::

#include <stdio.h>
#include <stdlib.h>static inline int compare(const void* a, const void* b) {return (int)(*(int*)a) - (int)(*(int*)b);
}static inline void printArray(int *array, int length) {int i;for (i = 0; i < length; i++) {printf("%d ", array[i]);}printf("\n");
}int main() {int length;int i;int *arr;printf("please input array length:");scanf("%d", &length);arr = calloc(length, sizeof(int));if (!arr) {fprintf(stderr, "calloc failed");}for (i = 0; i < length; i++) {arr[i] = rand() % 100;}printArray(arr, length);qsort(arr, length, sizeof(int), compare);printArray(arr, length);free(arr);return 0;
}

运行效果:

$ make
gcc -Wall main.c
$ ./a.out
please input array length:10
83 86 77 15 93 35 86 92 49 21
15 21 35 49 77 83 86 86 92 93
$

通过gcc -E -v -Wall main.c可以发现: stdlib.h是: /usr/include/stdlib.h
打开/usr/include/stdlib.h找一下:

原来, compare函数的类型是: int (*__compar_fn_t) (const void *, const void *)

void *真是万能啊!

那如果是复杂数据类型怎么排序呢?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>typedef struct {char* name;int age;
} User;static inline int compare(const void* a, const void* b) {User *u1 = (User*)a; // 将这段内存解释为User类型User *u2 = (User*)b;int cmp_result;// 如果name不一样, 按name的字典序if ((cmp_result = strcmp(u1->name, u2->name)) != 0) {return cmp_result;}// name一样的, age大的排在前return u2->age - u1->age;
}static inline void printArray(User *array, int length) {int i;for (i = 0; i < length; i++) {printf("name: %s, age: %d\n", array[i].name, array[i].age);}
}int main() {int length, i;User *arr, *tmp;char buf[32];printf("please input array length:");scanf("%d", &length);arr = calloc(length, sizeof(User));if (!arr) {fprintf(stderr, "calloc failed");exit(1);}srand((unsigned int)time(NULL));for (i = 0; i < length; i++) {tmp = malloc(sizeof(User));sprintf(buf, "zhangsan%d", rand() % 10);// tmp->name = buf;  // 固定的一块内存, 最终所有人名字都一样tmp->name = calloc(strlen(buf)+1, sizeof(char));memcpy(tmp->name, buf, strlen(buf));if (rand() & 1) { // 随机赋值tmp->age = rand() % 30;} else {tmp->age = 18;}memcpy(arr+i, tmp, sizeof(User));free(tmp);}printArray(arr, length);qsort(arr, length, sizeof(User), compare);printf("after:\n");printArray(arr, length);free(arr);return 0;
}

效果展示:

总结:

  1. qsort: 如果compare返回0, 则相同元素的相对顺序不定

(完)

C语言排序函数使用(qsort)相关推荐

  1. C语言排序函数——qsort

    C语言排序函数--qsort: qsort函数原型: void __cdecl qsort(void *_Base,size_t _NumOfElements,size_t _SizeOfElemen ...

  2. C++ 排序函数 sort(),qsort()的用法

    想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qsort,总算把自己解脱了~ 所以自己总结了一下,首先看sort函数见下表: 函数名 功能描述 sort 对给定区 ...

  3. c语言qsort函数简介,C语言排序函数—qsort函数

    前言: 在一些编程题中经常需要你按照某个指标按照从小到大或从大到小输出一些数据,这时你可以自己写一个排序函数进行排序,但是其实C语言函数库中就有一个排序函数--qsort函数,使用它可以节省你单独写排 ...

  4. C语言排序函数qsort( )

    关于c语言排序的问题,以前我都是用冒泡排序或者快速排序,知道这几天,在杭电上面打ACM的时候,才发现又一种排序的函数,就是qsort(): qsort()括号里面有4个参数 第一个参数是将要排序的数组 ...

  5. c语言sort函数包,qsort函数、sort函数【转】

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

  6. C++ 排序函数 sort(),qsort()的用法 附加.str()用法

    sort 函数名 功能描述 sort 对给定区间所有元素进行排序 stable_sort 对给定区间所有元素进行稳定排序 partial_sort 对给定区间所有元素部分排序 partial_sort ...

  7. c语言排序函数scan,scant(scant是什么函数)

    二者表示的程度不同,scare 甚于scant,更为稀缺,你可以看看下面的意思,scant [sk?nt] adj. 不足的:缺乏的:勉强够的 vt. 减少:节省:限制 [ 比较级scanter 最高 ...

  8. 【C语言】详解qsort函数使用和模拟实现

    一.qsort函数的使用 qsort的功能:qsort函数是C语言标准提供的排序函数 使用qsort函数需要引用头文件#include<stdlib.h> qsort函数能够排任意类型的数 ...

  9. sort()排序函数

    http://blog.csdn.net/zzzmmmkkk/article/details/4266888 想起来自己天天排序排序,冒泡啊,二分查找啊,结果在STL中就自带了排序函数sort,qso ...

最新文章

  1. 国际10-20标准电极位置
  2. pandas中loc、iloc与ix的用法比较
  3. 【译】A look at MobileIron’s zero sign-on and passwordless authentication plans
  4. Rtx userlist.php,【图片】【C语言】【控制台】提取腾讯通用户信息(id,用户名,手机)【erbi_lucifer吧】_百度贴吧...
  5. a标签连接空标签的方法
  6. 原生JS如何实现包含各种类型数据的深克隆
  7. TDT2 多语言本文 4.0 版 TDT3 多语言本文 2.0 版
  8. 在Linux环境下安装MYSQL
  9. 小程序ASC解密(java)
  10. HotSpot虚拟机对象揭秘
  11. WebRTC源码研究(27)TURN协议
  12. Java初学练手,一款汽车车牌号生成小工具
  13. ios游戏开发 Sprite Kit教程:初学者 1
  14. node mysql 坑_菜鸟Node.js MySQL教程遇到的坑
  15. 迅雷:游移的4亿用户帝国
  16. java代码将多张图片合成视频
  17. 项目选题报告答辩总结——日不落战队
  18. vue+el国际化-东抄西鉴组合拳
  19. pandas支持读取哪些类型文件_Pandas教程: 读取Excel文件
  20. 每日算法刷题Day7-比较字符串大小,去掉多余的空格,单词替换

热门文章

  1. 机器学习的学习曲线和验证曲线
  2. 体验管理|关于客户旅程编排(CJO),你不知道的事!
  3. python库之状态机transitions
  4. 加强生态环境保护,共建美好蓝天
  5. CSDN被盗号,博文全乱了。。。
  6. 【数字图像处理】六.MFC空间几何变换之图像平移、镜像、旋转、缩放具体解释...
  7. Centos7下team在roundrobin以及activebackup状态下对于iscsi target的性能影响
  8. 港科百创 | 清影华康斩获数千万人民币A轮融资
  9. RecastDemo用法
  10. B. Not Sitting