目录

  • 前言
  • 一、源码实例
  • 二、代码原理详解
  • 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语言的选择排序,你知道原理吗?相关推荐

  1. 选择排序字母串算法c语言,C语言实现选择排序算法

    新人新气象,我又来了,C语言实现选择排序.很基础的东西,原理什么的就不扯了. #include #include #include #define LENGTH 20 const WORD FORE_ ...

  2. c 冒泡排序_C语言中选择排序和冒泡排序

    点击上方"C语言中文社区",选择"设为星标★" 技术干货第一时间送达! 来源:https://blog.csdn.net/zjy18886018024/cate ...

  3. 李洋疯狂C语言之选择排序

    选择排序法 原理: 选择法循环过程与冒泡法一致,它还定义了记号min=i,然后依次把a[min]同后面的元素比较,若a[min]>a[j],则使k=j. 最后看看k=i是否还成立,不成立则交换a ...

  4. C语言实现选择排序——堆排序(大根堆、小根堆)

    C语言实现堆排序 文章目录 C语言实现堆排序 大根堆排序算法 1.交换操作 2.对结点进行调整为大根堆 3.建立大根堆 4.大根堆排序算法实现 小根堆排序算法 1.交换操作 2.对结点进行调整为小根堆 ...

  5. C语言实现选择排序——简单选择排序算法

    C语言实现简单选择排序 文章目录 C语言实现简单选择排序 简单选择排序算法 1.交换操作 2.简单选择排序算法实现 项目完整代码 运行效果图 简单选择排序算法 1.交换操作 //交换实现 void s ...

  6. C语言之选择排序算法

    C语言学习交流群:648422161.志同道合的小伙伴可以进群交流哦! 对于选择排序,咱们首先理解排序的思想.给定一个数组,这种思想首先假定数组的首元素为最大或者最小的.此时就要利用3个变量表示元素的 ...

  7. 链表排序(C语言)选择排序

    #include <stdio.h> #include <stdlib.h> #include <time.h> //用到了time函数#define arrayS ...

  8. php和python的选择排序算法,图文讲解选择排序算法的原理及在Python中的实现

    def sort_choice(numbers, max_to_min=True): """ 我这没有按照标准的选择排序,假设列表长度为n,思路如下: 1.获取最大值x, ...

  9. 【C语言】选择排序从小到大,从大到小,详细注释

    前言 选择排序算法通过选择和交换来实现排序,其排序流程如下: (1)首先从原始数组中选择最小的1个数据,将其和位于第1个位置的数据交换. (2)接着从剩下的n-1个数据中选择次小的1个元素,将其和第2 ...

最新文章

  1. VC删除IE缓存、COOKIE及记录
  2. win10下docker如何安装?
  3. C++库文件导出可见性
  4. 细看CRLF注入***的原理和其防范措施
  5. day15-ajax和jquery
  6. 贪心算法之高级钟点秘书会议安排问题
  7. C++算法学习(力扣:1269. 停在原地的方案数)
  8. shadow-cljs: JavaScript 依赖的实践
  9. 【ArcGIS|空间分析|网络分析】0 网络分析总结
  10. python截屏截图
  11. IP地址物理位置查询
  12. 4部网页配色电子书库之第3部——网页配色方案速查表
  13. Rasa 聊天机器人Rasa_NLU_Chi
  14. 前端项目实战11-hook usememo使用
  15. 抖音能成为下一个「微信」吗?
  16. 2022最新软件测试学习路线图
  17. 阿里云服务器的ECS和RDS和OSS和SLB是什么意思?
  18. 数字分解的套路与陷阱
  19. 俺也上IPV6了 顺便推荐几个IPV6视频站点
  20. 批处理备份及删除,forfiles命令详解

热门文章

  1. 存储服务器最高支持多少块硬盘,华为存储率先支持最大容量6TB氦气硬盘
  2. 计算机毕业设计古诗词小程序源码
  3. 多媒体通信中内容分发网络技术分析
  4. Redis---String数据类型的操作
  5. 思科模拟器 --- 交换机的基本配置与管理
  6. 计算机科学杂志社联系电话,《计算机科学》杂志社编辑部.doc
  7. 蓝牙耳机怎样才知道充满电
  8. 695岛屿的最大面积
  9. python永远滴神
  10. LINGO求解结果解析——影子价格、RSR、OCR