4745|7

1158

帖子

2

TA的资源

版主

楼主
 

简谈算法之选择排序 [复制链接]

        我们在面试互联网企业的软件开发岗位的时候,必不可少的会考到算法和数据结构的知识,而且这部分的内容也是我们在大学课程里面会学习到的内容,当然是指相关专业。那么我们在这里很大家一起分享相关的软件算法类的知识,因为自己也是边学习边总结,如果有什么不对或者需要大家补充的希望我们可以多多讨论,完善内容,能够帮助都后面有需要学习这一块内容的同学。
       今天我们来聊一聊排序算法当中的一个例子,选择排序,选择排序是比较好理解的一个排序方法,属于简单类型的,我们具体看下算法的实现内容。
我们先通过语言描述一下整个过程:
       首先呢,从一个数组中找到最小的元素然后将其和第一个元素交换,这样实现第一个元素是最小的,然后第二次就是找出次小的元素和第二个元素交换,依次进行,直到交换到最后一个元素,整个排序过程完成。
       这个应该是比较好理解的,我们就不画图了,我们可以直接通过代码当中进行解释如何实现的。
       相信注释已经非常清楚了,所以这里就不在进行文字说明了哈。
  1. <font size="3">#include <stdio.h>

  2. // 类型重定义
  3. typedef int Item;
  4. // 宏定义了一个key
  5. #define key(A) (A)
  6. // 宏定义一个大小判断的宏
  7. #define less(A, B) (key(A) < key(B))
  8. // 交换两个数值大小的宏
  9. #define exch(A, B) {Item t = A; A = B; B = t;}
  10. // 判断大小,并进行交换的宏,
  11. // 如果A大于B,两者进行交换
  12. #define compexch(A, B) if(less(B, A)) exch(A, B)
  13.         
  14. // 选择排序实现,输入一个数组和数组长度
  15. void choice_selection(Item a[], int length){
  16.         int i , j;   // 定义两个临时变量
  17.         for(i = 0; i < length; i++ ){
  18.                 int min = i;  // 首先把数组的第一个数值认为是最小的
  19.                 // 遍历剩下的所有元素,找到最小的那个,交换下标
  20.                 for(j = i+1; j < length; j++){
  21.                         // 如果a[j]小于a[min],则下标赋值为j
  22.                         if(less(a[j],a[min])) min = j;
  23.                 }               
  24.                 // 最后是交换两个数值,我们找到的那个最小的数值和第i个数值交换
  25.                 exch(a[i], a[min]);
  26.         }        
  27. }

  28. // 这里重新写一个非宏定义版本的
  29. void Choice_selection(Item a[], int length){
  30.         int i, j;
  31.         int temp = 0;
  32.         for(i = 0; i < length; i++ ){
  33.                 int min = i;  // 首先把数组的第一个数值认为是最小的
  34.                 // 遍历剩下的所有元素,找到最小的那个,交换下标
  35.                 for(j = i+1; j < length; j++){
  36.                         // 如果a[j]小于a[min],则下标赋值为j
  37.                         if(a[j] < a[min]) min = j;
  38.                 }               
  39.                 // 最后是交换两个数值,我们找到的那个最小的数值和第i个数值交换
  40.                 temp = a[i];
  41.                 a[i] = a[min];
  42.                 a[min] = temp;
  43.         }        
  44. }

  45. int main(void){
  46.         // 测试数组
  47.         Item array[] = {12 ,475 ,78 ,56 ,798 ,45 ,212 ,24, 65, 98};
  48.         // 得到数组的长度
  49.         int length = sizeof(array)/sizeof(Item);
  50.         // 定义一个临时变量
  51.         int i;
  52.         // 打印输出前的数组
  53.         for(i = 0;i < length; i ++){
  54.                 printf("%d ",array[i]);
  55.         }
  56.         printf(".\n");
  57.         // 选择排序
  58.         Choice_selection(array ,length);
  59.         // 打印输出后的数组
  60.         for(i = 0;i < length; i ++){
  61.                 printf("%d ",array[i]);
  62.         }
  63.         printf(".\n");
  64.         return 0;
  65. }</font>
复制代码





此帖出自编程基础论坛

最新回复

感谢分享  详情 回复 发表于 2016-12-16 17:55
点赞 关注
 

回复
举报

2万

帖子

71

TA的资源

管理员

沙发
 
谢谢分享,有你的一贯风格,脉络清晰哈
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身

点评

恩呢!经历校招,总结一下这些内容!  详情 回复 发表于 2016-12-6 18:01
 
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 

回复

165

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
感谢分享,讲的挺好如果把分享的脉络和链接贴出来就更好啦!!!~
此帖出自编程基础论坛

点评

链接是指汇总吗?  详情 回复 发表于 2016-12-6 18:02
 
个人签名什么都不会,只会水经验,请见谅。如果有什么得罪的地方,请找我们队长..................ID:lcofjp
 
 

回复

1366

帖子

6

TA的资源

版主

4
 
感谢分享,MAKE下。希望楼主多多分享
此帖出自编程基础论坛

点评

恩呢,也希望能够多多关注哈!  详情 回复 发表于 2016-12-6 18:03
 
个人签名

1084534438 欢迎交流  [加油,一切皆有可能]

 
 

回复

1158

帖子

2

TA的资源

版主

5
 
soso 发表于 2016-12-6 12:01
谢谢分享,有你的一贯风格,脉络清晰哈

恩呢!经历校招,总结一下这些内容!
此帖出自编程基础论坛
 
 
 

回复

1158

帖子

2

TA的资源

版主

6
 
哼哼哈嘿丨墨染 发表于 2016-12-6 14:49
感谢分享,讲的挺好如果把分享的脉络和链接贴出来就更好啦!!!~

链接是指汇总吗?
此帖出自编程基础论坛
 
 
 

回复

1158

帖子

2

TA的资源

版主

7
 
RCSN 发表于 2016-12-6 14:50
感谢分享,MAKE下。希望楼主多多分享

恩呢,也希望能够多多关注哈!
此帖出自编程基础论坛
 
 
 

回复

9161

帖子

6

TA的资源

管理员

8
 
感谢分享
此帖出自编程基础论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表