一、算法原理

选择排序属于不稳定排序法,是一种常用的排序算法,其时间复杂度为O(n^2)。
所谓的不稳定排序算法是指在一组数据中存在多个相同的数据,但是在排序之后,相同数据的前后位置会发生改变。例如有数据{5, 5., 2},使用选择排序法,排序结果为{2, 5., 5},即两个相同数据5的前后位置发生了改变。
选择排序算法原理就是首先固定一个位置i,用该位置上的元素data与后面的元素data_j依次比较大小。以从小到大排序为例,如果data > data_j,则交换这两个数据,直到位置i之后的所有元素都小于该位置上的元素结束。之后执行i++即可完成该数组的排序。
Demo:假设有数据如下表所示:数组名记为data

Step 1:固定下标i为1,取出其位置上的元素data[1],与之后的每一个位置上的元素进行比较,当比较到位置3的时候,该位置上的元素data[3]<data[1],此时交换data[1]和data[3],得到如下数组。

然后从data[4]开始继续和data[1]比较,重复前述工作,最终完成与data[1]的比较,并得到如下的数组:

Step 2:固定下标为2,从data[3]开始比较与data[2]的大小,遇到反序的元素则交换。最终得到如下数组:

Step 3:固定下标为3,从data[4]开始比较与data[3]的大小,遇到反序的元素则交换。最终得到如下数组:

Step 4:固定下标为4,从data[5]开始比较与data[4]的大小,遇到反序的元素则交换。最终得到如下数组:

Step 5:固定下标为5,从data[6]开始比较与data[5]的大小,遇到反序的元素则交换。最终得到如下数组:

二、算法

1. 固定某个位置i的排序算法
Step 1: 取出元素data[i];
Step 2:j = i+1,比较data[i]和data[j],如果反序则交换data[i]和data[j]的值,转Step 3;
Step 3:j = j+1,如果j等于数组的长度n,则结束,否则转Step 2.
2.选择排序算法
固定的位置i从1开始直到i=n-1,依次执行上述固定位置的排序算法即可。
从算法流程可以看出,选择排序算法的时间复杂度是O(n^2)。
3.选择排序算法流程图

三、算法之C程序

1.选择排序算法之C语言版

/*
功能:使用选择排序法对数组data进行排序
输入参数:data,已知数据散乱的数组n,元素的个数
输出参数:Data,排好序的数组
返回值:无
*/
void SelectionSort( int data[], int n )
{int i, j, t, k;for( i = 1; i <= n-1; i++ ){//输出每一轮排序前的状态 for( k = 1; k <= n; k++  ){printf( "%5d", data[k] );}printf( "\n" );//排序 for( j = i+1; j <= n; j++ ){if( data[j] < data[i] ){t       = data[i];data[i] = data[j];data[j] = t;}}}
}

2.完整的代码(仅供参考)

#include"stdio.h"
#define MaxLength 100void InputData( int &count, int arrt[] );
void SelectionSort( int data[], int n );int main()
{int count = 0, i, j;int data[MaxLength];InputData( count, data );SelectionSort( data, count ); for( i = 1; i <= count; i++ ){printf( "%5d", data[i] );}return 0;
}
/*
功能:使用选择排序法对数组data进行排序,为了显示每一趟排序,增加了输出
输入参数:data[],已知数据散乱的数组n,元素的个数
输出参数:data[],排好序的数组
返回值:无
*/
void SelectionSort( int data[], int n )
{int i, j, t;for( i = 1; i <= n-1; i++ ){//输出每一趟排序前的数组 for( k = 1; k <= n; k++  ){printf( "%5d", data[k] );}printf( "\n" );//排序for( j = i+1; j <= n; j++ ){if( data[j] < data[i] ){t       = data[i];data[i] = data[j];data[j] = t;}}}
}
//从键盘读入一组整数存储到数组arr中,元素个数存储到count中
void InputData( int &count, int arrt[] )
{int i = 0, data;while( 1 ){printf( "input an integer(end of 65535)" );scanf( "%d", &data );if( data == 65535 ){break;}else{arrt[++i] = data;}}count = i;
}

3.测试用例

四、算法改进

上述算法中,两层循环里的操作是数据交换。事实上,对于每个固定的i,其实是从data[i]到data[n]中寻找最小值,在寻找最小值的过程中可能会发生多次数据交换,这其实降低了算法的执行效率。解决这个问题的其中一个方法是只把data[i]和最小值交换一次,具体实现方法就是把data[i]存放到data[0],然后每次遇到小于data[0]的元素就将其存放到data[0]中,同时记录其位置下标loc,最后把data[0]中元素存入data[i],把data[i]存入data[loc]即可。此法可以有效提高排序的效率。
具体算法实现如下:

void SelectionSort( int data[], int n )
{int i, j, t, k, loc;for( i = 1; i <= n-1; i++ ){data[0] = data[i]; loc = 0;//输出每一轮排序前的状态 for( k = 1; k <= n; k++  ){printf( "%5d", data[k] );}printf( "\n" );//排序 for( j = i+1; j <= n; j++ ){if( data[j] < data[0] ){data[0] = data[j];loc = j;}}if( loc > i ){data[loc] = data[i];data[i] = data[0];}}
}

测试二

选择排序算法详解之C语言版相关推荐

  1. 加标志量的选择排序算法c语言,置换选择排序算法详解(C语言实现)

    上一节介绍了增加 k-路归并排序中的 k 值来提高外部排序效率的方法,而除此之外,还有另外一条路可走,即减少初始归并段的个数,也就是本章第一节中提到的减小 m 的值. m 的求值方法为:m=⌈n/l⌉ ...

  2. 十大经典排序算法-选择排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  3. 经典排序算法(6)——直接选择排序算法详解

    直接选择排序(Straight Select Sort)是一种典型的选择排序算法,通过不断选择序列中最大(小)的元素. 一.算法基本思想 (1)基本思想 直接选择排序的基本思想就是:不断从未排序队列中 ...

  4. 折半插入排序算法详解之C语言版

    一.算法原理 折半插入排序是插入排序方法中一种,相比较与直接插入排序算法,减少了排序过程中比较次数,也是一种常用的排序算法. 折半插入排序算法基本原理是将折半查找方法与直接插入排序方法相结合,也就是在 ...

  5. 计算机操作系统——银行家算法详解(C语言版)

    目录 一.实验目的 二.实验内容 三.实验要点说明 数据结构 银行家算法bank()函数 安全性算法safe()函数 银行家算法实例 程序结构 四.实验代码 五.结果展示 一.实验目的 通过编写一个模 ...

  6. 哈希(Hash)查找算法详解之C语言版

    一.哈希查找算法原理 哈希查找是一种快速查找算法,该算法不需要对关键字进行比较,而是以关键字为自变量,以该关键字在存储空间中的地址为因变量,建立某种函数关系,称为哈希函数,这样在查找某一关键字的时候, ...

  7. 霍夫曼(Huffman)编码算法详解之C语言版

    一.Huffman编码 霍夫曼(Huffman)树是一类带权路径长度最短的二叉树树.Huffman树的一个非常重要的应用就是进行Huffman编码以得到0-1码流进行快速传输. 在电报收发等数据通讯中 ...

  8. 十大经典排序算法-桶排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

  9. 十大经典排序算法-希尔排序算法详解

    十大经典排序算法 十大经典排序算法-冒泡排序算法详解 十大经典排序算法-选择排序算法详解 十大经典排序算法-插入排序算法详解 十大经典排序算法-希尔排序算法详解 十大经典排序算法-快速排序算法详解 十 ...

最新文章

  1. 德富莱智能抹墙机器人_深圳智能制造应急生产联盟成立,大咖共探机器人行业新机遇...
  2. 2018.2.11-12 写作业
  3. python下载地址-python下载网址
  4. 负载均衡策略_负载均衡策略
  5. WEB技术架构的资源链接。
  6. sql求平均日活_杨学峰博客 | Flask Sqlarchemy实现按日、周、月统计并图表展示
  7. 网页html好学嘛,javascript好学么?
  8. 论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
  9. 摔倒、摔倒检测数据集
  10. 终于明白上一篇的一顿误操作是什么了,是$,不是S !!!!!
  11. 杀死 tomcat 进程的脚本
  12. JSK-134 求出现次数最多的字符【入门】
  13. vuex模块化 怎么引用state_vue 组件如何调用 vuex 模块中的getters
  14. Displaytag的使用四
  15. AD将原理图转换成彩色或者黑白PDF
  16. teststand-介绍
  17. 小白都能学会的Python基础 第一讲:Python初了解
  18. 手机 APP 安全登录的几种方式
  19. win10触摸板双指单击不能唤出右键菜单
  20. ARM7(LPC2xxx)芯片的小总结

热门文章

  1. 推荐程序开发辅助软件(流程图软件+代码注释软件)
  2. httrack镜像网站(kali版与win版)
  3. windows 粘贴功能不可用
  4. 如何在vscode中设置一个狂炫酷霸吊炸天的背景图片
  5. 给实体对象属性的空值赋默认值
  6. 启动光盘制作教程(整合自己的光盘)
  7. 安卓运行Jupyter Notebook操作指南,不用电脑也能做数据分析!
  8. 智慧工地解决方案-最新全套文件
  9. 热解反应aspen,基于Aspen Plus平台的生物质热解模型与应用研究综述
  10. 达梦数据库创建表空间,用户,模式