《排序算法系列一、简单选择排序》
2019独角兽企业重金招聘Python工程师标准>>>
一、简单选择排序
描述:给定待排序序列A[ 0......n ] ,选择出第i小元素,并和A[i]交换,这就是一趟简单选择排序。
示例:给定数组A[0 ...... 5]={3, 5, 8, 9, 1, 2},分析A数组进行选择排序的过程:
第一趟:i=1,index=5, a[1] 和 a[5] 进行交换。得到序列:{ 1,5,8,9,3,2 }
第二趟:i=2,index=6, a[2] 和 a[6] 进行交换。得到序列:{ 1,2,8,9,3,5 }
第三趟:i=3,index=5, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,9,8,5 }
第四趟:i=4,index=6, a[3] 和 a[5] 进行交换。得到序列:{ 1,2,3,5,8,9 }
第五趟:i=5,index=5, 不用交换。得到序列:{ 1,2,3,5,8,9 }
6-1)趟选择结束,得到有序序列:{ 1,2,3,5,8,9 }
public class SimpleSelectionSort1 {void simpleSelectionSort(int[] arr) {int length = arr.length;int i, j, index;//1. 进行length-1趟选择,每次选择出最小值for (i = 0; i < length; i++) {index = i;//2. 选择第i小记录为arr[index]for (j = i+1; j < length; j ++) {if (arr[j] < arr[index]) {index = j;}}if (index != i) {arr[i] = arr[i] + arr[index];arr[index] = arr[i] - arr[index];arr[i] = arr[i] - arr[index];}}printArray(arr);}void printArray(int[] array) {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}}public static void main(String[] args) {int[] arr = {9, 6, 12, 1, 15, 10, 17, 2, 11, 1, 4, 8, 19, 14};SimpleSelectionSort1 selectionSort = new SimpleSelectionSort1();selectionSort.simpleSelectionSort(arr);}
}
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;public class SimpleSelectionSort2 {public List<Integer> list = new ArrayList<Integer>();/*** 递归函数进行简单选择排序--采用list存储新排序的array,不太好* @param arr 待排序的数组*/void simpleSelectionSort(int[] arr) {int length = arr.length;int i, index;if (length == 1) {list.add(arr[0]);printArray(list);return;}//选择序列中最小元素,下标为indexfor (i = index = 0; i < length; i++) {if (arr[i] < arr[index]) {index = i;}}//将最小元素与序列中首元素交换if (index != 0) {arr[0] = arr[0] + arr[index];arr[index] = arr[0] - arr[index];arr[0] = arr[0] - arr[index];}list.add(arr[0]);//去除序列中的最小首元素,进行递归调用arr = Arrays.copyOfRange(arr, 1, arr.length);simpleSelectionSort(arr);}/*** 递归函数进行简单选择排序* @param array 待排序的数组* @param startIndex 从startIndex数组下标开始往后排序,忽略startIndex之前的元素*/public void simpleSelectionSortRecursion(int[] array, int startIndex){//递归结束条件if(startIndex == array.length - 1){printArray(array);return;}//假设start元素为最小值int minIndex = startIndex;for(int i = startIndex; i < array.length; i++){if(array[i] < array[minIndex]){minIndex = i;}}//如果start元素就是最小值,则不再交换if (minIndex != startIndex) {array[startIndex] = array[startIndex] + array[minIndex];array[minIndex] = array[startIndex] - array[minIndex];array[startIndex] = array[startIndex] - array[minIndex];}//递归:前面一位已经排序成功,排序startIndex元素往后移一位simpleSelectionSortRecursion(array, startIndex + 1);}void printArray(List<Integer> array) {Iterator iterator = array.iterator();while (iterator.hasNext()) {System.out.print(iterator.next() + " ");}}void printArray(int[] array) {for (int i = 0; i < array.length; i++) {System.out.print(array[i] + " ");}}public static void main(String[] args) {int[] arr = {9, 6, 12, 1, 15, 10, 17, 2, 11, 1, 4, 8, 19, 14};SimpleSelectionSort2 selectionSort2 = new SimpleSelectionSort2();selectionSort2.simpleSelectionSort(arr);System.out.println("\n------------分割线--------------");selectionSort2.simpleSelectionSortRecursion(arr, 0);}
}
性能分析
容易看出,简单选择排序所需进行记录移动的操作次数较少,这一点上优于冒泡排序,最佳情况下(待排序序列有序)记录移动次数为0,最坏情况下(待排序序列逆序)记录移动次数n-1。
外层循环进行了n-1趟选择,第i趟选择要进行n-i次比较。每一趟的时间:n-i次的比较时间+移动记录的时间(为一常数0或1,可以忽略)。总共进行了n-1趟。忽略移动记录的时间,所以总时间为(n-1)*(n-i)=n^2-(i+1)*n+i。时间复杂度为O(n^2)。不管是最坏还是最佳情况下,比较次数都是一样的,所以简单选择排序平均时间、最坏情况、最佳情况 时间复杂度都为O(n^2)。同时简单选择排序是一种稳定的原地排序算法。当然稳定性还是要看具体的代码,在此就不做深究。
转载于:https://my.oschina.net/u/1757476/blog/464700
《排序算法系列一、简单选择排序》相关推荐
- ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析
视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...
- 信息学奥赛真题解析(玩具谜题)
玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...
- 信息学奥赛之初赛 第1轮 讲解(01-08课)
信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...
- 信息学奥赛一本通习题答案(五)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通习题答案(三)
最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...
- 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题
第1章 快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章 素数 第 3 章 约数 第 4 章 同余问题 第 5 章 矩阵乘法 第 6 章 ...
- 信息学奥赛一本通题目代码(非题库)
为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...
- 信息学奥赛一本通(C++版) 刷题 记录
总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...
- 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离
首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...
最新文章
- CodeChefSeries Sum (伯努利数+生成函数+FFT)
- 关于 SAP Spartacus 服务器端渲染 SSR 无法使用窗口宽度以进行自适应设计的问题
- 华为鸿蒙系统智能手机_余承东再度确认:鸿蒙系统将适配到华为手机上
- leetcode 有效的数独
- 深度学习《CGAN模型》
- 程序员说的demo是什么意思_“黄龄说的什么意思”???
- eosio.msig合约源码分析
- 【java笔记】继承
- 计算机会计学ufo报表,UFO报表管理实验报告.doc
- rose 生产java代码m_rose 生成代码
- 无线网卡性能怎么测试软件,无线性能测试平台和方法
- JUnit 5预期异常
- android之框架xUtils介绍
- 后端开发工程师的工作流程是怎样的
- 市场上的智能语音助理,主要的工作原理是什么?
- Linux C popen函数返回Shell命令执行结果
- 一维中值、均值、高斯滤波的MATLBA实现
- Oracle数据库培训视频教程 oracle工程师培训视频教程
- 一份 Git cheat sheet 送给您
- Android获取酷狗音乐歌曲详情
热门文章
- dubbo启动顺序问题
- CentOS7 Apache调优之开启deflate压缩模块
- 网络数据被截取,该如何维权?
- 全面梳理关系型数据库和 NoSQL 的使用情景
- 关于CSS3的filter(滤镜) 属性
- 《Python编程初学者指南》——1.6 回到Game Over程序
- IntelliJ IDEA2016.2 Eclipse(mac os x)常用推荐捷键手册
- 发现WinSRV2003SP1并没有包含ASP+Access的BUG更新
- 来学学数据分析吧(二)第一章 预测和关联数量特征
- 使用docker搭建一个elasticsearch(5.4)的基础环境