转自https://www.cnblogs.com/shen-hua/p/5424059.html

a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕。也就是:每一趟在n-i+1(i=1,2,…n-1)个记录中选取关键字最小的记录作为有序序列中第i个记录。基于此思想的算法主要有简单选择排序、树型选择排序和堆排序。(这里只介绍常用的简单选择排序)

b) 简单选择排序的基本思想:给定数组:int[] arr={里面n个数据};第1趟排序,在待排序数据arr[1]~arr[n]中选出最小的数据,将它与arrr[1]交换;第2趟,在待排序数据arr[2]~arr[n]中选出最小的数据,将它与r[2]交换;以此类推,第i趟在待排序数据arr[i]~arr[n]中选出最小的数据,将它与r[i]交换,直到全部排序完成。

c) 举例:数组 int[] arr={5,2,8,4,9,1};

-------------------------------------------------------

第一趟排序: 原始数据:5  2  8  4  9  1

最小数据1,把1放在首位,也就是1和5互换位置,

排序结果:1  2  8  4  9  5

-------------------------------------------------------

第二趟排序:

第1以外的数据{2  8  4  9  5}进行比较,2最小,

排序结果:1  2  8  4  9  5

-------------------------------------------------------

第三趟排序:

除1、2以外的数据{8  4  9  5}进行比较,4最小,8和4交换

排序结果:1  2  4  8  9  5

-------------------------------------------------------

第四趟排序:

除第1、2、4以外的其他数据{8  9  5}进行比较,5最小,8和5交换

排序结果:1  2  4  5  9  8

-------------------------------------------------------

第五趟排序:

除第1、2、4、5以外的其他数据{9  8}进行比较,8最小,8和9交换

排序结果:1  2  4  5  8  9

-------------------------------------------------------

注:每一趟排序获得最小数的方法:for循环进行比较,定义一个第三个变量temp,首先前两个数比较,把较小的数放在temp中,然后用temp再去跟剩下的数据比较,如果出现比temp小的数据,就用它代替temp中原有的数据。具体参照后面的代码示例,相信你在学排序之前已经学过for循环语句了,这样的话,这里理解起来就特别容易了。

代码示例:

//选择排序
public class SelectionSort {
public static void main(String[] args) {
int[] arr={1,3,2,45,65,33,12};
System.out.println("交换之前:");
for(int num:arr){
System.out.print(num+" ");
}
//选择排序的优化
for(int i = 0; i < arr.length - 1; i++) {// 做第i趟排序
int k = i;
for(int j = k + 1; j < arr.length; j++){// 选最小的记录
if(arr[j] < arr[k]){
k = j; //记下目前找到的最小值所在的位置
}
}
//在内层循环结束,也就是找到本轮循环的最小的数以后,再进行交换
if(i != k){ //交换a[i]和a[k]
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
}
}
System.out.println();
System.out.println("交换后:");
for(int num:arr){
System.out.print(num+" ");
}
} }

运行结果截图:

选择排序的时间复杂度:简单选择排序的比较次数与序列的初始排序无关。 假设待排序的序列有 N 个元素,则比较次数永远都是N (N - 1) / 2。而移动次数与序列的初始排序有关。当序列正序时,移动次数最少,为 0。当序列反序时,移动次数最多,为3N (N - 1) /  2。

所以,综上,简单排序的时间复杂度为 O(N2)

最新文章

  1. c++虚函数调用及使用
  2. awk用法总结笔记
  3. C# Ini配置文件
  4. Eclipse关联JavaDoc和源代码
  5. iOS之设置状态栏颜色
  6. selenium webdriver(4)---模拟鼠标键盘操作
  7. php开发入门教程
  8. Android06-Fragment碎片
  9. dedecms模板中使用php代码
  10. javascript 代码放在head和body的区别
  11. NoSQL数据库
  12. Get and Post(Unity3D开发之六)
  13. python之内置函数(二)与匿名函数、递归函数初识
  14. Markdown 指南
  15. JVM新生代到老年代基础了解
  16. CentOS 修改用户密码
  17. 来数一数XML解析成为Dataset数据
  18. docker 使用swarm overlay网络时,报“network xx not manually attachable”错误解决
  19. 通过Java发送邮件和接收邮件的工具类
  20. forword和重定向有什么区别?

热门文章

  1. 单片机PWM调制技术
  2. RubyMotion之父:Ruby是目前替代Objective-C的最佳iOS开发语言
  3. centos 5.3 安装(samba 3.4.4)
  4. 自制无线共享工具C++源代码
  5. 关于如何通过kali linux 攻击以及破解WPA/WPA2无线加密
  6. Tornado、Bottle以及Flask
  7. jsonp跨域获取数据小解
  8. 分布式配置管理平台XXL-CONF
  9. Flex 右键菜单控制
  10. 关于HTML5中的sessionStorage和localStorage