简单选择排序的原理

简单选择排序的原理非常简单,即在待排序的数列中寻找最大(或者最小)的一个数,与第 1 个元素进行交换,接着在剩余的待排序的数列中继续找最大(最小)的一个数,与第 2 个元素交换。以此类推,一直到待排序的数列中只有一个元素时为止。

也就是说,简单选择排序可分为两部分,一部分是选择待排序的数列中最小的一个数,另一部分是让这个数与待排序的数列部分的第1个数进行交换,直到待排序的数列只有一个元素,至此整个数列有序。

这个算法非常简单,其排序过程如

图 1 简单选择排序的排序过程

其中的方框部分为待排序的数列部分,双下画线的元素为待排序的数列中最小的元素,单下画线的元素为待排序的数列的首元素,每一趟让它们进行交换,最终得到有序数列。

简单选择排序的实现

简单选择排序的实现代码如下:

public class SelectSort {

private int[] array;

public SelectSort(int[] array) {

this.array = array;

}

public void sort() {

int length = array.length;

for (int i = 0; i < length; i++) {

int minIndex = i;

for (int j = i + 1; j < array.length; j++) {

if (array[j] < array[minIndex]) {

minIndex = j;

}

}

if (minIndex != i) {

int temp = array[minIndex];

array[minIndex] = array[i];

array[i] = temp;

}

}

}

public void print() {

for (int i = 0; i < array.length; i++) {

System.out.println(array[i]);

}

}

}

通过代码,我们发现这个算法其实挺烂的,而且应该有可以优化的方法,这里先卖个关子。测试代码如下:

public class SortTest {

public static void main(String[] args) {

testSelectSort();

}

/**

* 简单选择排序

*/

private static void testSelectSort() {

int[] array = {5, 9, 1, 9, 5, 3, 7, 6, 1};

SelectSort selectSort = new SelectSort(array);

selectSort.sort();

selectSort.print();

}

}

选择排序的特点及性能

由于在简单选择排序中,我们一般在原本的待排序的O(1)。

在最好的情况下,每次要找的最大(或者最小)的元素就是待排序的数列的第1个元素,也就是说数列本身有序,这样我们只需要一次遍历且不需要交换,即可实现一趟排序;而在最坏的情况下,每次在数列中要找的元素都不是第 1 个元素,每次需要交换。比较的次数只与数列的长度有关,而在外部要遍历整个数列,也与长度有关,所以这样的双重循环不管在什么情况下,O(n2)。

但由于选择排序不需要一个一个地向前移动,而是直接交换,而比较所消耗的 CPU 要比交换所消耗的 CPU 小一些,所以选择排序的时间复杂度相对于

简单选择排序的优化

通过选择排序的思想,我们知道选择排序的一个重要步骤是在待排序的数列中寻找最大(或者最小)的一个元素,那么如何寻找这个元素就成为一个可以优化的点。

另外,我们每次都要寻找两个值中一个是最大值,一个是最小值。这时如果需要将数列从小到大排列,就要把最小值与待排序的数列的第1个元素进行交换,把最大值与待排序的数列的最后一个元素进行交换。这样我们一次就能寻找两个元素,使外层循环的时间缩短了一半,性能也提高了很多。而且通过一次遍历就可以直接找出两个最值,并没有其他性能损耗。这种一次找两个值的选择排序的算法实现,留给读者自己去尝试。

选择排序的适用场景

简单选择排序并不很常用,它只是选择排序的一个思想基础,选择排序还有其他方案可以实现。在理解了简单选择排序之后,我们就更容易理解和学习其他方案了。选择排序的用途非常广泛,之后我们继续讲解如何使用它们。

java 排序原理_简单选择排序算法原理及java实现(超详细)相关推荐

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

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

  2. python选择排序算法图解_简单选择排序算法(C语言详解版)

    该算法的实现思想为:对于具有 n 个记录的无序表遍历 n-1 次,第 i 次从无序表中第 i 个记录开始,找出后序关键字中最小的记录,然后放置在第 i 的位置上. 例如对无序表{56,12,80,91 ...

  3. 查询数据的排序的位置_简单选择排序C++实现

    简单选择排序是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,第一次从下标为0的开始,将下标为0的这个数与后面的n-1个进行比较:找出最小或者最大的放在下标为0的这个位置 ...

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

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

  5. 内部排序 (四):选择排序 Selection Sorting (简单选择排序、堆排序)

    作为数据结构的课程笔记,以便查阅.如有出错的地方,还请多多指正! 目录 简单选择排序 Simple Selection Sort 排序过程 算法实现 算法评价 T(n) S(n) 是否稳定 堆排序 H ...

  6. 【简单排序算法】:简单选择排序、直接插入排序和冒泡排序

    [简单排序算法]:简单选择排序.直接插入排序和冒泡排序 简单选择排序: 原理:设所排序序列的记录个数为n.i取1,2,-,n-1,每次从所有n-i+1个记录(Ri,Ri+1,-,Rn)中找出最小的记录 ...

  7. 数据结构排序算法——选择排序(简单选择排序)

    简单选择排序(Simple Selection Sort) 一.算法基本思想: 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放 ...

  8. 【排序综合】直接插入排序,希尔排序,快速排序,堆排序,冒泡排序,简单选择排序的简介,实现和算法复杂度分析

    目录 1. 直接插入排序 1.1 直接插入排序简介 1. 什么是直接插入排序 2. 排序思想 1.2 排序实现 1. 排序代码 2. 复杂度分析: 3. 运行结果: 1.3 学习链接 2. 希尔排序( ...

  9. 简单选择排序--转载

    ​ 排序是数据处理中十分常见且核心的操作,虽说实际项目开发中很小几率会需要我们手动实现,毕竟每种语言的类库中都有n多种关于排序算法的实现.但是了解这些精妙的思想对我们还是大有裨益的.本文简单温习下最基 ...

最新文章

  1. linux cat 查看文件内容 不带#号的,Linux下如何不用cat命令读取文件内容
  2. Matlab概率统计编程指南
  3. tf.Variable()、tf.get_variable()
  4. 采用docker部署3台Redis分布式红锁实例
  5. 游戏设计艺术 第2版 (Jesse Schell 著)
  6. 初见,Devexpress
  7. BIGWORLD问题集
  8. pdf页面倒序如何调整?
  9. dos命令、find、findstr、ping、nbtstat、netstat、net、at、ftp、telnet、tasklist、taskkill、netsh...
  10. Python操作MongoDb与Redis以及ODM
  11. python合法整型常量要符合什么条件_1.下列字符列中,合法的长整型常量是: 【 】...
  12. 获取基因的所有转录本(不同亚型)的外显子区域
  13. 用Tortoise SVN抽取补丁包(patch)
  14. 大场景室内点云标注数据集S3DIS介绍
  15. JQuery实现动态漂浮广告
  16. 黄鸭兄《傲慢是精英的耻辱,谦虚是精英的责任》摘录
  17. 还记得最初的梦想么?——2018年小结
  18. autoCAD 设置 AutoCAD 系统配置
  19. element-ui中的el-table-column加v-if不生效,表头错乱
  20. Linux时间一直跳回原始时间,Linux时间同步

热门文章

  1. 动态执行shell脚本
  2. EasyExcel 导出时 Converter转换器 注入 ExcelContentProperty 为null
  3. php改变iframe的src,js动态改变iframe的src属性
  4. java在实际应用_Java应用程序如何部署在“现实世界”中?
  5. 景点门票销售系统系统java_某景点门票销售管理系统
  6. html5 拍照 清晰度,html5强大的功能(一)
  7. 三菱plcfx5u指令手册_从西门子200的PLC程序来看三菱FX5U的PLC程序
  8. php教程调用数据库,PHP数据库调用类调用实例,php数据库调用实例_PHP教程
  9. java annotation 实现_在Java中如何实现自己的annotation
  10. android fragment addtobackstack,Android Fragment Back Stack的问题