目录

一:选择法比较数据大小

二:qsort函数

三  在选择法的基础上自创“qsort”函数

四 完整代码如下

五 总结


一:选择法比较数据大小

选择法顾名思义就是先进行选择,在进行排列。

主要步骤有

  1. 先从所有数中找到那个最小的,把这个数与第一个数进行交换。
  2. 再从除了第一个数之外的剩余数中,再找出较小的,并与第二个数进行交换。
  3. 重复下去,直到最后一个。

重复操作得出最终结果

具体代码实现操作

#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函数和选择法排列得到的启发。相关推荐

  1. PTA-6-3 使用函数的选择法排序 (25分)(C语言)

    本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n是数组a中元素的个数.该函数用选择法将数组a中 ...

  2. 使用函数的选择法排序

    2-6-5 使用函数的选择法排序(25 分) 本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中a是待排序的数组,n ...

  3. [PTA]实验8-1-4 使用函数的选择法排序

    Spring-_-Bear 的 CSDN 博客导航 本题要求实现一个用选择法对整数数组进行简单排序的函数. 函数接口定义: void sort( int a[], int n ); 其中 a 是待排序 ...

  4. qsort函数排序数据 and 模拟实现qosrt函数的功能(详解)

    前言:内容包括使用库函数qsort排序任意类型的数据,模拟实现qsort函数(冒泡排序的逻辑) 我们先了解qsort函数的语法:qsort函数默认按照升序排序数据 void qsort (void* ...

  5. 计算机中用函数排序,编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出。...

    编写一个sort()函数,实现选择法排序,在主函数中输入10个整数,主函数调用sort()函数实现排序后将数据输出. 重赏重赏 更新时间:2019-05-06 04:06 最满意答案 #include ...

  6. 编写一个C程序,实现以下功能:定义一个学生结构体Student(含学号、姓名、年龄、身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序。在主函数中

    编写一个C程序,实现以下功能: 定义一个学生结构体Student(含学号.姓名.年龄.身高)和一个函数sort(struct Student *p),该函数使用选择排序法按年龄由小到大排序.在主函数中 ...

  7. 自定义函数实现对n个数进行选择法排序,主函数调用.

    题目: 自定义函数实现对n个数进行选择法排序,主函数调用. 要求:共自定义3个函数,分别对数组进行输入,排序和输出. 代码实现如下: #include<bits/stdc++.h> usi ...

  8. 【C语言】qsort函数用法(转)

    qsort函数用法 qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(cons ...

  9. C语言中数组的排序算法详解——选择法、冒泡法、交换法、插入法、折半法

    选择法排序 选择法排序是指:如果要把一个数组从小到大排列,那么就从该数组中依次选择最小的数字来排序.从第一个数字开始,将第一个数字与数组中剩下数字中最小的那一个交换位置,然后将第二个数字与剩下数字中最 ...

最新文章

  1. CentOS 服务器安全设置
  2. PHP 年龄计算函数
  3. python 编程之计算器
  4. 2019.7.16考试总结
  5. 【转载】IPPROTO_RAW IPPROTO_IP
  6. 谁是真凶?《CSI:犯罪现场调查》正帮助AI提高断案能力
  7. AspNetPager分页控件报错“对象不支持此属性或方法”
  8. 自动化运维工具(光纤交换机接口功率监控)
  9. SurfaceView 实现 转盘抽奖
  10. 北京林业大学本科毕业论文答辩和论文选题PPT模板
  11. 程序员如何用优秀免费软件替代盗版软件/流氓软件
  12. 手机和电脑如何快速传大文件
  13. 第二讲:PN结与二极管的特性
  14. 移动周报:最受欢迎的跨平台开发工具推荐
  15. 美式口语发音技巧:《发音总结》
  16. 【SpringBoot注解-4】:@Target、@Retention、@Documented注解简介
  17. MongoDB语法案例
  18. 量化交易 第二课 平台介绍
  19. Redis的哨兵机制你知道多少撒
  20. 安卓 输入法出现导致布局变形问题解决

热门文章

  1. android根据音乐路径获取音乐时长,采样率等
  2. 淘宝推流地址如何获取?抖音推流地址如何获取?技术干货(2020-12-29)
  3. access表格怎么取消冻结字段_MOS认证考试大纲Access 2010
  4. 别卷了!23年二级建造师备考攻略
  5. 2019长沙理工大学计算机专业分数线,长沙理工大学
  6. stata绘制roc曲线_两种诊断方法的ROC曲线比较,手把手教Medcalc软件操作
  7. iphone 强制刷新drawRect方法
  8. [ASP.NET Debugging BuggyBits读书笔记] 预备知识 Part 2
  9. SPS 所有信息分析
  10. browserify/browserify