C语言的选择排序,你知道原理吗?
目录
- 前言
- 一、源码实例
- 二、代码原理详解
- 1.选择排序原理
- 2.代码分析
前言
前面的冒泡排序讲得有点冗长,废话太多,请堵着门见谅!今天的选择排序尽量精简。但是选择排序有点抽象,我当初学的时候也是搞了很久才明白,所以就算看不懂也要树立信心,学习是循序渐进的,搞算法不要成天想着用葵花宝典。
一、源码实例
直接附上源码,如果熟悉直接略过,初学者可详看详解!
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){int i,j,t,k;int a[5];srand((int)time(0));printf("The score of the singers:\n");for(i=0;i<5;i++){a[i]=(int)(60+40*rand()/RAND_MAX);printf("%5d",a[i]);}printf("\n");for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(a[j]>a[k]) k=j;if(k!=i){int t;t=a[i];a[i]=a[k];a[k]=t;}}for(i=0;i<5;i++)printf("%5d",a[i]);
}
二、代码原理详解
1.选择排序原理
给出一个长度为5 的数组:3 2 4 5 8
它们的下标分别为: 0 1 2 3 4
从大到小排列,步骤如下:
(1)第一轮:从五个数中找出最大的一个数,与下标为0的数交换。
具体实现:
①将a[0]的下标0赋值给k,用k表示最大数的下标。k=0
②将a[k]与a[1]比较,3>2,k的值不变。
③将a[k]与a[2]比较,3<4,将4所在下标赋值给k。k=2
④将a[k]与a[3]比较,4<5,将5所在下标赋值给k。k=3
⑤将a[k]与a[4]比较,5<8,将8所在下标赋值给k。k=4
⑥找到了第一轮的最大值,将它与a[0]交换。即a[k]与a[0]交换。
数组变成:8 2 4 5 3
(2)第二轮:从四个数中找出最大的一个数,与下标为1的数交换。
如果在第一轮看懂原理的话,这里应该可以推算得出。
找到第二轮的最大值,a[k]与a[1]交换。
数组变成:8 5 4 2 3
(3)第三轮:从三个数中找出最大的一个数,与下标为2的数交换。
该轮找出的最大值下标恰好为2,k=2。不必进行交换
数组仍为:8 5 4 2 3
(4)第四轮:从两个数中找出最大的一个数,与下标为3的数交换。
找出最大值的下标为5,k=5,。a[k]与a[3]交换。
数组变成:8 5 4 3 2
2.代码分析
为避免读者们不必要的上下翻滚,先再次附上源码。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){int i,j,t,k;int a[5];srand((int)time(0));printf("The score of the singers:\n");for(i=0;i<5;i++){a[i]=(int)(60+40*rand()/RAND_MAX);printf("%5d",a[i]);}printf("\n");for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(a[j]>a[k]) k=j;if(k!=i){int t;t=a[i];a[i]=a[k];a[k]=t;}}for(i=0;i<5;i++)printf("%5d",a[i]);
}
分析:
①#include<stdio.h>为C语言必要头文件,不过多赘述。
②srand((int)time(0))中,srand函数位于头文件中,
time函数位于头文件<time.h>中。srand((int)time(0))语句可种下随机数种子,这条语句是随机取值的前提条件。
③a[i]=(int)(60+40*rand()/RAND_MAX);表示为a[i]取60~100的随机数,RAND_MAX表示(60+40),即为最大范围100。
④选择排序的核心
for(i=0;i<4;i++){k=i;for(j=i+1;j<5;j++)if(a[j]>a[k]) k=j;if(k!=i){int t;t=a[i];a[i]=a[k];a[k]=t;}
数组长度为5,需要进行4轮比较。
每轮比较都把 i 置为最大数的下标,用k表示。即k=i。
用a[k]分别跟后续的所有数比较,每次比较时,如果遇到比a[k]更大的数,就改变k的值,将更大数的下标赋值给j。
for(j=i+1;j<5;j++)
if(a[j]>a[k]) k=j;语句执行完毕后,就找到了最大值的下标,并且赋给了k。k的值有可能与 i 的值重叠。
if(k!=i){int t;t=a[i];a[i]=a[k];a[k]=t;
它表示将最大数a[k]与第 i 轮比较所对应的 a[i] 交换。为了让 k 不与 i 重叠,if(k!=i)语句是必须的。
这样就完成了选择排序的执行。
对于初学者可能有点难理解,多花点时间消化消化!
C语言的选择排序,你知道原理吗?相关推荐
- 选择排序字母串算法c语言,C语言实现选择排序算法
新人新气象,我又来了,C语言实现选择排序.很基础的东西,原理什么的就不扯了. #include #include #include #define LENGTH 20 const WORD FORE_ ...
- c 冒泡排序_C语言中选择排序和冒泡排序
点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来源:https://blog.csdn.net/zjy18886018024/cate ...
- 李洋疯狂C语言之选择排序
选择排序法 原理: 选择法循环过程与冒泡法一致,它还定义了记号min=i,然后依次把a[min]同后面的元素比较,若a[min]>a[j],则使k=j. 最后看看k=i是否还成立,不成立则交换a ...
- C语言实现选择排序——堆排序(大根堆、小根堆)
C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...
- C语言实现选择排序——简单选择排序算法
C语言实现简单选择排序 文章目录 C语言实现简单选择排序 简单选择排序算法 1.交换操作 2.简单选择排序算法实现 项目完整代码 运行效果图 简单选择排序算法 1.交换操作 //交换实现 void s ...
- C语言之选择排序算法
C语言学习交流群:648422161.志同道合的小伙伴可以进群交流哦! 对于选择排序,咱们首先理解排序的思想.给定一个数组,这种思想首先假定数组的首元素为最大或者最小的.此时就要利用3个变量表示元素的 ...
- 链表排序(C语言)选择排序
#include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数#define arrayS ...
- php和python的选择排序算法,图文讲解选择排序算法的原理及在Python中的实现
def sort_choice(numbers, max_to_min=True): """ 我这没有按照标准的选择排序,假设列表长度为n,思路如下: 1.获取最大值x, ...
- 【C语言】选择排序从小到大,从大到小,详细注释
前言 选择排序算法通过选择和交换来实现排序,其排序流程如下: (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换. (2)接着从剩下的n-1个数据中选择次小的1个元素,将其和第2 ...
最新文章
- VC删除IE缓存、COOKIE及记录
- win10下docker如何安装?
- C++库文件导出可见性
- 细看CRLF注入***的原理和其防范措施
- day15-ajax和jquery
- 贪心算法之高级钟点秘书会议安排问题
- C++算法学习(力扣:1269. 停在原地的方案数)
- shadow-cljs: JavaScript 依赖的实践
- 【ArcGIS|空间分析|网络分析】0 网络分析总结
- python截屏截图
- IP地址物理位置查询
- 4部网页配色电子书库之第3部——网页配色方案速查表
- Rasa 聊天机器人Rasa_NLU_Chi
- 前端项目实战11-hook usememo使用
- 抖音能成为下一个「微信」吗?
- 2022最新软件测试学习路线图
- 阿里云服务器的ECS和RDS和OSS和SLB是什么意思?
- 数字分解的套路与陷阱
- 俺也上IPV6了 顺便推荐几个IPV6视频站点
- 批处理备份及删除,forfiles命令详解