使用回调实现对一组任意类型的对象做快速排序
来源:互联网 发布:超少年密码之人工智能 编辑:程序博客网 时间:2024/06/06 08:47
qsort函数实现对一组任意类型对象的排序,调用者提供 findPos_t 回调函数,在回调函数中实现对特定类型元素位置的查找。
// qsort.h#ifndef QSORT_H#define QSORT_Htypedef int (*findPos_t)(void *a[], int left, int right);extern void qsort(void *a[], int left, int right, findPos_t findPos);#endif
// qsort.c#include "qsort.h"void qsort(void * a[], int left, int right, findPos_t findPos) { int pos; if(left < right) { pos = findPos(a, left, right); qsort(a, left, pos - 1, findPos); qsort(a, pos + 1, right, findPos); } }
// qsortMain.c#include <stdio.h>#include "qsort.h"typedef struct { const char *name; int score;} student_t;int findPos(void * a[], int left, int right) { int val = *(int *)a[left]; while(left < right) { while(left < right && val <= *(int *)a[right]) { right --; } *(int *)a[left] = *(int *)a[right]; while(left < right && val >= *(int *)a[left]) { left ++; } *(int *)a[right] = *(int *)a[left]; } *(int *)a[left] = val; return left;}int findPos_student(void * a[], int left, int right) { student_t val = *(student_t *)a[left]; while(left < right) { while(left < right && val.score <= ((student_t *)a[right])->score) { right --; } *(student_t *)a[left] = *(student_t *)a[right]; while(left < right && val.score >= (*(student_t *)a[left]).score) { left ++; } *(student_t *)a[right] = *(student_t *)a[left]; } *(student_t *)a[left] = val; return left;}int main(void) { int i; int data[5] = {1, 7, 4, 2, 5}; int *pdata[5] = {&data[0], &data[1], &data[2], &data[3], &data[4]}; qsort((void **)pdata, 0, 5 - 1, findPos); for(i = 0; i < 5; i ++) { printf("%d ", data[i]); } putchar('\n'); student_t list[4] = {{"Tom", 68}, {"Jerry", 72}, {"Moby", 60}, {"Kirby", 89}}; student_t *plist[4] = {&list[0], &list[1], &list[2], &list[3]}; qsort((void **)plist, 0, 4 - 1, findPos_student); for(i = 0; i < 4; i ++) { printf("%s %d\n", list[i].name, list[i].score); } return 0;}
0 0
- 使用回调实现对一组任意类型的对象做快速排序
- Go语言:使用sort包对任意类型元素的集合进行排序
- 建立可对任意属性排序的对象集合
- 建立可对任意属性排序的对象集合
- collections 接口存储一组不唯一,无序的对象。提供了对集合进行排序,遍历等对种算法的实现
- 双调排序进阶:对任意长度的序列排序
- 使用堆排序对一组随机数进行排序
- 不使用PHP内置排序函数对二维数组实现快速排序的面试题
- 对jsonArray数组存储的对象做自定义按多个值排序
- 使用hadoop对一组数据排序,求平均值。
- 对一个List<B>类型的对象进行排序
- 做的一组实验
- 任意类型通用的qsort冒泡排序
- 花旗软件 电面问题(一) 根据对象的某一属性排序一组对象(JAVA实现)
- Java任意同类型对象的复制
- Java任意同类型对象的复制
- Java任意同类型对象的复制
- 使用Golang实现的快速排序
- 尺度空间理论
- Activity切换动画的实现(右上角由小变大)
- 图片命名规范
- 字符操作编程题(不断更新)
- eclipse列编辑
- 使用回调实现对一组任意类型的对象做快速排序
- 实现时分秒的倒计时效果
- for和foreach循环的效率对比
- Android Studio导入jar包
- 自定义View的分类和流程
- 通过编程实现,统计1~n有多少个9 提示:n通过参数传入
- springmvc整合freemarker,使用ftl文件
- Redis 字符串(String)
- 理解HTTP幂等性