选择排序就是从待排序的元素中选择最小(最大)的元素,将其放在有序序列的相应位置,使这些元素构成有序序列。选择排序主要有两种:简单选择排序和堆排序。

【简单选择排序】

编写算法,要求使用简单选择排序算法对元素65、32、71、28、83、7、53、49进行从小到大排序。

【算法思想】

简单选择排序是一种简单的选择类排序算法,它的基本思想描述如下:

假设待排序的元素有n个,在第一趟排序过程中,从n个元素序列中选择最小的元素,并将其放在元素序列的最前面,即第一个位置。在第二趟排序过程中,从剩余的n-1个元素中,选择最小的元素,将其放在第二位置。以此类推,直到没有待比较的元素,简单选择排序算法结束。

例如:

给定一组元素序列:55、33、22、66、44。简单选择排序的过程如下:

* 第一趟排序:从第1个元素开始,将第1个元素与第2个元素进行比较,因为55>33,所以33是较小的元素;继续将33与第3个元素22比较,因为33>22,所以22成为较小的元素;将22与第4个元素66比较,因为22<66,所以22仍然是比较小的一个元素;最后将22与第5个元素44比较,因为22<44,所以22就是这5个元素中最小的一个元素,并将22与第1个元素交换,此时,完成第1趟排序。第1趟排序过程如下图:

初始时,假设最小元素的下标为0。在比较过程中,用j记下最小元素的下标。经过第1趟排序后,最小的元素位于第1个位置上(处于正确的位置)。

*第二趟排序:从第2元素开始,将第2个元素与第3个元素进行比较,因为33<55,所以33是较小的元素;继续将33与第4个元素66比较,因为33<66,所以33仍然是较小的元素;将33与第5个元素44进行比较,因为33<44,所以33就是最小的元素,并将33与第2个元素进行交换,此时,完成第2趟排序。第2趟排序过程如下图。


在第2趟排序过程中,33收最小的元素,本身就在第2个位置,不需要移动元素。

*第三趟排序:从第3个元素开始,将第3个元素和第4个元素进行比较,因为55<66,所以55是较小的元素;继续将55与第5个元素44比较,因为55>44,所以44是较小的元素,并将44与第3个元素交换,此时,完成第3趟排序,过程如下:

到目前为止前三个元素都已经有序,接下来只需确定第四个元素和第五个元素的顺序即可。

*第四趟排序:比较第4个元素与第5个元素,即66与55的大小,因为66>55,所以55是较小的元素,并将66与55交换,此时,完成第4趟排序。第4趟排序过程如图所示。

此时,前4个元素都已经有序且位于正确的位置上,那么,第5个元素也位于正确的位置上。因此,整个简单选择排序结束。

【示例】

假设待排序元素有8个,分别是65、32、71、28、83、7、53、49。使用简单选择排序对该元素序列过程如图所示。

在简单选择排序过程中,如果待排序元素的个数为n,则需要n-1趟剖需要。对于第i趟排序,需要比较的次数为i-1。当第i趟排序完毕,将该趟排序过程中最小的元素放在第i个位置,此时,前i个元素都已经有序且在正确的位置上。

code:

#include<stdio.h>
void SelectSort(int a[], int n);
void DispArray(int a[], int n);
void main()
{int a[] = { 65,32,71,28,83,7,53,49 };int n = sizeof(a) / sizeof(a[0]);printf("排序前:\n");DispArray(a, n);SelectSort(a, n);printf("最终排序结果:");DispArray(a, n);getchar();
}
void SelectSort(int a[], int n)
/*简单选择排序*/
{int i, j, k, t;/*将第i个元素与第i+1...n个元素比较,将最小的的元素放在第i个位置*/for (i = 0; i<n - 1; i++){j = i;for (k = i + 1; k<n; k++)  /*最小的元素的序号为j*/if (a[k]<a[j])j = k;if (j != i)          /*如果序号i不等于j,则需要将序号i和序号j的元素交换*/{t = a[i];a[i] = a[j];a[j] = t;}printf("第%d趟排序结果:", i + 1);DispArray(a, n);}
}
void DispArray(int a[], int n)
/*输出数组中的元素*/
{int i;for (i = 0; i<n; i++)printf("%4d", a[i]);printf("\n");
}

result:

【主要用途】

简单选择排序算法实现简单,适用于排序元素较少且对时间要求不高的场合。

【稳定性与复杂度】

简答选择排序森一种不稳定的排序算法。在最坏的情况下,待排序的严肃序列按照非递减排列,则不要移动元素。在最坏的情况下,待排序元素按照非递增排列,则在每一趟都需要移动元素,移动元素的次数为3(n-1)。在任何情况下,简单选择排序算法都需要进行n(n-1)/2 的比较。综上,简单选择排序算法的时间复杂度是O(n^2)。简答选择排序的空间复杂度为O(1)。

排序算法5——简单选择排序相关推荐

  1. 排序算法:简单选择排序算法实现及分析

    简单选择排序算法介绍 简单选择排序(Simple Selection Sort)就是通过n-1次关键字排序之间的比较,从n-i+1个记录中选择关键字最小的记录,并和第i(1<=i<=n)记 ...

  2. 排序算法-05简单选择排序(python实现)

    简单选择排序 概述 顾名思义,这是一种选择排序. 其步骤大致是,每一趟排序从待排记录中找到一个最小的关键字,放到已排序记录末尾,知道排序结束. 算法详解 首先,从待排记录中找到最小元素 如果最小元素不 ...

  3. 两种选择排序算法:简单选择排序、堆排序

    一.简单选择排序 空间复杂度:O(1) 时间复杂度:O(n^2) 稳定性:不稳定 适用性:顺序表.链表 //简单选择排序 void SelectSort(int A[],int n){for(i=0; ...

  4. 三种简单排序算法---冒泡排序,简单选择排序,直接插入排序

    冒泡排序 核心思想:类似水泡一样,一趟比较,通过相邻元素的交换,冒出当前序列的最小值(最大值)到相应位置 复杂度分析 最好的情况:序列本身有序,只要进行n-1次比较,无需交换,时间复杂度为O(n) 最 ...

  5. 【排序算法】简单选择排序及实例_C语言代码实现_Python代码实现

    博客对您有所帮助的话,欢迎给个赞啦,你的鼓励是对我最大的支持! 有不足之处也请您评论指教 简单选择排序 简单选择排序是选择排序的一种. 问:那么什么是选择排序? 答:每趟从待排序的记录中选出关键字最小 ...

  6. java 排序原理_简单选择排序算法原理及java实现(超详细)

    简单选择排序的原理 简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换.以 ...

  7. 《大话数据结构》第9章 排序 9.4 简单选择排序

    9.4.1 简单选择排序算法 爱炒股票短线的人,总是喜欢不断的买进卖出,想通过价差来实现盈利.但通常这种频繁操作的人,即使失误不多,也会因为操作的手续费和印花税过高而获利很少.还有一种做股票的人,他们 ...

  8. js排序算法详解-选择排序

    全栈工程师开发手册 (作者:栾鹏) js系列教程5-数据结构和算法全解 js排序算法详解-选择排序 相对于冒泡排序还有一种类似的方法就是选择排序,顾名思义就是选择性排序,什么意思呢? 这么来理解,假设 ...

  9. 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树

    文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...

最新文章

  1. Python加速运行技巧
  2. 共享变量类vb.net中的共享方法、共享变量、全局变量
  3. android studio编辑不了,无法在Android Studio中编辑文件
  4. wxWidgets:wxBitmapButton类用法
  5. 临界区、互斥量、信号量、事件的区别
  6. 在JDK 12精简数字格式中使用最小分数数字
  7. Android项目架构设计深入浅出
  8. Tensorflow基础语法和概念
  9. Android编程之Toast官方使用说明译文
  10. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_05-freemarker基础-List指令
  11. 第二章 关键数据结构
  12. EditPlus 3 实现将JSON字符串格式化、排版成JSON格式数据
  13. kali PHP网站渗透,小白日记35:kali渗透测试之Web渗透
  14. docker容器中使用vlc将视频文件推成rtsp流
  15. postman接口测试工具的使用攻略
  16. html加拼音注释,《弟子规》全文带拼音注释(下)
  17. js vue 获取 (昨天、今天、明天) 时间
  18. IO 操作 (二进制流文件上传下载)
  19. Sort_1000pics数据集利用CNN实现图像分类
  20. spotify歌曲下载_k表示使用Spotify歌曲功能进行聚类

热门文章

  1. 基于centos7.9安装 imagemagick7.1.0
  2. 常用----音乐切换
  3. CCF-百度松果基金开放申请
  4. OutLook2007自定义信纸方法
  5. 设置快速的debian源
  6. 安装包UI美化之路-nsNiuniuSkin安装包模板介绍
  7. python数据处理,用于大学生期末考试(还没完全写完,待更新)
  8. 健身房老板跑路怎么办
  9. android仿支付宝头像裁剪,易用的头像裁剪上传、头像美化组件
  10. Ubuntu20.04 操作系统切换中文 安装中文输入法