从qsort函数和选择法排列得到的启发。
目录
一:选择法比较数据大小
二:qsort函数
三 在选择法的基础上自创“qsort”函数
四 完整代码如下
五 总结
一:选择法比较数据大小
选择法顾名思义就是先进行选择,在进行排列。
主要步骤有
- 先从所有数中找到那个最小的,把这个数与第一个数进行交换。
- 再从除了第一个数之外的剩余数中,再找出较小的,并与第二个数进行交换。
- 重复下去,直到最后一个。
重复操作得出最终结果
具体代码实现操作
#include<stdio.h>
int main()
{int array[] = { 2,4,5,8,7,-3,-58,4,1,-8,14,3,2,5 };int num = sizeof(array) / sizeof(array[0]);int i, j,k,t;for (i = 0; i < num; i++){k = i;for (j = i + 1; j < 10; j++)if (array[j] < array[k])k = j;t = array[k];array[k] = array[i];array[i] = t;}for (i = 0; i < num; i++)printf("%d ", array[i]);return 0;
}
运行结果:
-58 -8 -3 1 2 2 3 4 4 5 5 7 8 14
二:qsort函数
- 函数原型 void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *elem1, const void *elem2 ) );
- void *base:Start of target array;(目标阵列的开始,要排列对像的起始位置)
- size_t num:Array size in element; (数组大小(以元素为单位),要排列目标的数量)
- size_t width:Element size in bytes;(每个元素的大小(单位是字节))
- int (__cdecl *compare )(const void *elem1, const void *elem2 ):
- compare: Comparison function.
- elem1: Pointer to the key for the search;
- elem2: Pointer to the array element to be compared with the key.
官方解释放在下面
我们尝试使用一下这个函数
#include<stdio.h>
#include<stdlib.h>//qsort所在的头文件int compare_int(const void* e1, const void* e2)//定义一个比较方法的函数
{return *((int*)e1) - *((int*)e2);//(int*)表示强制类型转换,将他转化为int*的指针类型,然后对其解引用。
}
int main()
{int array[] = { 2,4,5,8,7,-3,-58,4,1,-8,14,3,2,5 };//定义一个数组。int num = sizeof(array) / sizeof(array[0]);//计算数组元素个数。int width = sizeof(int);//计算int类型所占字节qsort(array,num,width,compare_int);int i = 0;for (i = 0; i < num; i++)printf("%d ",array[i]);return 0;
}
运行结果如下:
-58 -8 -3 1 2 2 3 4 4 5 5 7 8 14
D:\系统资源\图片\系统资源\视频\下载\项目\test_5.11_选择法排序\Debug\test_5.11_选择法排序.exe (进程 17344)已退出,代码为 0。
按任意键关闭此窗口. . .
非常方便的把他们比较了出来
三 在选择法的基础上自创“qsort”函数
开始之前我们首先得掌握这些基础知识:
- char类型占一个字节的空间
- 数据是连续存放的。
- 强制转换数据类型。
有了这些知识,我们就可以自创一个比较函数了:
void select_way ( void* address, int num, int size , int(*cmp) (const void* buffer1 ,const void* buffer2);
和qsort传参类似,下面我们实现具体代码:
void select_way(void* address, int num, int size, int(*cmp)(const void* buffer1, const void* buffer2)) {int i = 0, j = 0;char* k = NULL;//int*tmp = NULL;for (i = 0; i < num; i++){k = (char*)address + i * size;for (j = i+1; j < num; j++){if (cmp(k,((char*)address + j * size)) >0){k = (char*)address + j * size;}}swap(k,(char*)address + i * size,size);} } void swap(char* buffer1, char* buffer2, int size) {int i = 0;for (i = 0; i < size; i++){char tmp = *buffer1;*buffer1=*buffer2;*buffer2 = tmp;buffer1++;buffer2++;} }
函数的内容。
具体解释一下各个部分的问题:
k = (char*)address + i * size;
- (char*)将其强制转换成了字符指针类型的数据。
- size 代表的这一个数据所占的空间大小,i代表第几次。
- k = (char*)address + i * size i=0就代表刚开始将一号元素的地址付给k;
for (j = i+1; j < num; j++){if (cmp(k,((char*)address + j * size)) >0){k = (char*)address + j * size;}}
- (char*)address + j * size 这个类比上面的就是把把k与(char*)address + j * size元素进行比较,如果k比较大,就将(char*)address + j * size交给k;
- (char*)address + j * size显然就是后面的元素
- 时刻记住数组的空间地址是连续的,就很容易理解这时为什么。
void swap(char* buffer1, char* buffer2, int size) {int i = 0;for (i = 0; i < size; i++){char tmp = *buffer1;*buffer1=*buffer2;*buffer2 = tmp;buffer1++;buffer2++;} }
最后在看看这个swap函数,也十分有意思;
- 不管是神么类型的数据,都将其转换成字符类型,计算机读取每次读一个字符,用size确定该元素的实际大小,用一个for循环实现交换数据。
- 图片展示
是不是很好的理解。
但是函数的实现必须得自己写,这时我们得保持一个清醒的头脑,知道要写什么,改传递什么参数,比较的大小。
select_way函数不局限于数组,结构体也可以,但要清楚传递啥参数。
四 完整代码如下
#include<stdio.h>
void select_way(void* address, int num, int size, int(*cmp)(const void* buffer1, const void* buffer2))
{int i = 0, j = 0;char* k = NULL;//int*tmp = NULL;for (i = 0; i < num; i++){k = (char*)address + i * size;for (j = i + 1; j < num; j++){if (cmp(k, ((char*)address + j * size)) > 0){k = (char*)address + j * size;}}swap(k, (char*)address + i * size, size);}
}
void swap(char* buffer1, char* buffer2, int size)
{int i = 0;for (i = 0; i < size; i++){char tmp = *buffer1;*buffer1 = *buffer2;*buffer2 = tmp;buffer1++;buffer2++;}
}
int cmp_int(const void* e1, const void* e2)
{return *((int*)e1) - *((int*)e2);
}
int main()
{int i = 0;void select_way(void* address, int num, int size, int(*cmp)(const void* buffer1, const void* buffer2));void swap(char* buffer1, char* buffer2, int size);int cmp_int(const void* e1, const void* e2);int array[] = { 2,4,5,8,7,-3,-58,4,1,-8,14,3,2,5 };int num = sizeof(array) / sizeof(array[0]);select_way(array, num, sizeof(int), cmp_int);for (i = 0; i < num; i++)printf("%d ", array[i]);return 0;
}运行结果: -58 -8 -3 1 2 2 3 4 4 5 5 7 8 14
五 总结
- 传参特别要注意~~~~~~~~~~~
- char 类型的灵活运用
从qsort函数和选择法排列得到的启发。相关推荐
- PTA-6-3 使用函数的选择法排序 (25分)(C语言)
本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n是数组a中元素的个数.该函数用选择法将数组a中 ...
- 使用函数的选择法排序
2-6-5 使用函数的选择法排序(25 分) 本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n ...
- [PTA]实验8-1-4 使用函数的选择法排序
Spring-_-Bear 的 CSDN 博客导航 本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中 a 是待排序 ...
- qsort函数排序数据 and 模拟实现qosrt函数的功能(详解)
前言:内容包括使用库函数qsort排序任意类型的数据,模拟实现qsort函数(冒泡排序的逻辑) 我们先了解qsort函数的语法:qsort函数默认按照升序排序数据 void qsort (void* ...
- 计算机中用函数排序,编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出。...
编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出. 重赏重赏 更新时间:2019-05-06 04:06 最满意答案 #include ...
- 编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中
编写一个C程序,实现以下功能: 定义一个学生结构体Student(含学号.姓名.年龄.身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序.在主函数中 ...
- 自定义函数实现对n个数进行选择法排序,主函数调用.
题目: 自定义函数实现对n个数进行选择法排序,主函数调用. 要求:共自定义3个函数,分别对数组进行输入,排序和输出. 代码实现如下: #include<bits/stdc++.h> usi ...
- 【C语言】qsort函数用法(转)
qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(cons ...
- C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法
选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...
最新文章
- CentOS 服务器安全设置
- PHP 年龄计算函数
- python 编程之计算器
- 2019.7.16考试总结
- 【转载】IPPROTO_RAW IPPROTO_IP
- 谁是真凶?《CSI:犯罪现场调查》正帮助AI提高断案能力
- AspNetPager分页控件报错“对象不支持此属性或方法”
- 自动化运维工具(光纤交换机接口功率监控)
- SurfaceView 实现 转盘抽奖
- 北京林业大学本科毕业论文答辩和论文选题PPT模板
- 程序员如何用优秀免费软件替代盗版软件/流氓软件
- 手机和电脑如何快速传大文件
- 第二讲:PN结与二极管的特性
- 移动周报:最受欢迎的跨平台开发工具推荐
- 美式口语发音技巧:《发音总结》
- 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
- MongoDB语法案例
- 量化交易 第二课 平台介绍
- Redis的哨兵机制你知道多少撒
- 安卓 输入法出现导致布局变形问题解决
热门文章
- android根据音乐路径获取音乐时长,采样率等
- 淘宝推流地址如何获取?抖音推流地址如何获取?技术干货(2020-12-29)
- access表格怎么取消冻结字段_MOS认证考试大纲Access 2010
- 别卷了!23年二级建造师备考攻略
- 2019长沙理工大学计算机专业分数线,长沙理工大学
- stata绘制roc曲线_两种诊断方法的ROC曲线比较,手把手教Medcalc软件操作
- iphone 强制刷新drawRect方法
- [ASP.NET Debugging BuggyBits读书笔记] 预备知识 Part 2
- SPS 所有信息分析
- browserify/browserify