2019独角兽企业重金招聘Python工程师标准>>>

一、简单选择排序

  1. 描述:给定待排序序列A[ 0......n ] ,选择出第i小元素,并和A[i]交换,这就是一趟简单选择排序。

  2. 示例:给定数组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

《排序算法系列一、简单选择排序》相关推荐

  1. ComeFuture英伽学院——2020年 全国大学生英语竞赛【C类初赛真题解析】(持续更新)

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  2. ComeFuture英伽学院——2019年 全国大学生英语竞赛【C类初赛真题解析】大小作文——详细解析

    视频:ComeFuture英伽学院--2019年 全国大学生英语竞赛[C类初赛真题解析]大小作文--详细解析 课件:[课件]2019年大学生英语竞赛C类初赛.pdf 视频:2020年全国大学生英语竞赛 ...

  3. 信息学奥赛真题解析(玩具谜题)

    玩具谜题(2016年信息学奥赛提高组真题) 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业.有一天, 这些玩具小人把小南的眼镜藏了起来.小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的 ...

  4. 信息学奥赛之初赛 第1轮 讲解(01-08课)

    信息学奥赛之初赛讲解 01 计算机概述 系统基本结构 信息学奥赛之初赛讲解 01 计算机概述 系统基本结构_哔哩哔哩_bilibili 信息学奥赛之初赛讲解 02 软件系统 计算机语言 进制转换 信息 ...

  5. 信息学奥赛一本通习题答案(五)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  6. 信息学奥赛一本通习题答案(三)

    最近在给小学生做C++的入门培训,用的教程是信息学奥赛一本通,刷题网址 http://ybt.ssoier.cn:8088/index.php 现将部分习题的答案放在博客上,希望能给其他有需要的人带来 ...

  7. 信息学奥赛一本通 提高篇 第六部分 数学基础 相关的真题

    第1章   快速幂 1875:[13NOIP提高组]转圈游戏 信息学奥赛一本通(C++版)在线评测系统 第2 章  素数 第 3 章  约数 第 4 章  同余问题 第 5 章  矩阵乘法 第 6 章 ...

  8. 信息学奥赛一本通题目代码(非题库)

    为了完善自己学c++,很多人都去读相关文献,就比如<信息学奥赛一本通>,可又对题目无从下手,从今天开始,我将把书上的题目一 一的解析下来,可以做参考,如果有错,可以告诉我,将在下次解析里重 ...

  9. 信息学奥赛一本通(C++版) 刷题 记录

    总目录详见:https://blog.csdn.net/mrcrack/article/details/86501716 信息学奥赛一本通(C++版) 刷题 记录 http://ybt.ssoier. ...

  10. 最近公共祖先三种算法详解 + 模板题 建议新手收藏 例题: 信息学奥赛一本通 祖孙询问 距离

    首先什么是最近公共祖先?? 如图:红色节点的祖先为红色的1, 2, 3. 绿色节点的祖先为绿色的1, 2, 3, 4. 他们的最近公共祖先即他们最先相交的地方,如在上图中黄色的点就是他们的最近公共祖先 ...

最新文章

  1. CodeChefSeries Sum (伯努利数+生成函数+FFT)
  2. 关于 SAP Spartacus 服务器端渲染 SSR 无法使用窗口宽度以进行自适应设计的问题
  3. 华为鸿蒙系统智能手机_余承东再度确认:鸿蒙系统将适配到华为手机上
  4. leetcode 有效的数独
  5. 深度学习《CGAN模型》
  6. 程序员说的demo是什么意思_“黄龄说的什么意思”???
  7. eosio.msig合约源码分析
  8. 【java笔记】继承
  9. 计算机会计学ufo报表,UFO报表管理实验报告.doc
  10. rose 生产java代码m_rose 生成代码
  11. 无线网卡性能怎么测试软件,无线性能测试平台和方法
  12. JUnit 5预期异常
  13. android之框架xUtils介绍
  14. 后端开发工程师的工作流程是怎样的
  15. 市场上的智能语音助理,主要的工作原理是什么?
  16. Linux C popen函数返回Shell命令执行结果
  17. 一维中值、均值、高斯滤波的MATLBA实现
  18. Oracle数据库培训视频教程 oracle工程师培训视频教程
  19. 一份 Git cheat sheet 送给您
  20. Android获取酷狗音乐歌曲详情

热门文章

  1. dubbo启动顺序问题
  2. CentOS7 Apache调优之开启deflate压缩模块
  3. 网络数据被截取,该如何维权?
  4. 全面梳理关系型数据库和 NoSQL 的使用情景
  5. 关于CSS3的filter(滤镜) 属性
  6. 《Python编程初学者指南》——1.6 回到Game Over程序
  7. IntelliJ IDEA2016.2 Eclipse(mac os x)常用推荐捷键手册
  8. 发现WinSRV2003SP1并没有包含ASP+Access的BUG更新
  9. 来学学数据分析吧(二)第一章 预测和关联数量特征
  10. 使用docker搭建一个elasticsearch(5.4)的基础环境