基本排序_选择排序_Java实现
2015-12-18 09:57
267 查看
转载请注明出处:/article/11557474.html
本文出自:【梁敬明的博客】
如上图所示,假设一个序列的初始状态为【7】【5】【9】【6】【8】,将序列由小到大进行排序,每次遍历时,将最小的数前置,防止再已排序元素的后面,直到完成排序为止。
第一次排序,将元素7与之后的其他元素进行比较,将最小的数交换到第一个位置,找到最小的数为5。
第二次排序,将元素7与之后的其他元素进行比较,将最小的数交换到第二个位置,找到最小的数为6。
第三次排序,将元素9与之后的其他元素进行比较,将最小的数交换到第三个位置,找到最小的数为7。
第四次排序,将元素9与之后的其他元素进行比较,将最小的数交换到第四个位置,找到最小的数为8。
剩余最后一个元素9,位于序列的最后位置。
当进行第i次排序时,从第i位的元素开始依次向后比较,最后将最小的元素,排到序列的第i位。
选择排序的比较次数与序列的初始状态无关,其比较次数总是n(n−1)2\frac{n(n-1)}{2},交换操作次数位于0到(n−1)0到(n-1)之间,当序列为正序时,元素的交换次数为0,当序列为反序时,元素的交换次数为3(n−1)3(n-1)。
因此,选择排序的时间复杂度为O(n2)O(n^2)。
算法稳定性:
对于序列【2】【1】【1】,第一次遍历第一个元素【2】和最后一个元素【1】发生位置交换,原序列中两个【1】的前后位置发生改变,因此选择排序是一种不稳定的排序算法。
本文出自:【梁敬明的博客】
1.选择排序
选择排序就是按照指定的先后顺序依次从待排序的元素中选择最大或最小的一个元素,存放到序列的起始位置,直到完成全部排序为止。如上图所示,假设一个序列的初始状态为【7】【5】【9】【6】【8】,将序列由小到大进行排序,每次遍历时,将最小的数前置,防止再已排序元素的后面,直到完成排序为止。
第一次排序,将元素7与之后的其他元素进行比较,将最小的数交换到第一个位置,找到最小的数为5。
第二次排序,将元素7与之后的其他元素进行比较,将最小的数交换到第二个位置,找到最小的数为6。
第三次排序,将元素9与之后的其他元素进行比较,将最小的数交换到第三个位置,找到最小的数为7。
第四次排序,将元素9与之后的其他元素进行比较,将最小的数交换到第四个位置,找到最小的数为8。
剩余最后一个元素9,位于序列的最后位置。
2.示例代码
对一个长度为N的序列由小到大进行排序,第i次排序需要找到的最小数为m,将其排在序列的第i位,排序最终完成时需要进行N-1次排序。当进行第i次排序时,从第i位的元素开始依次向后比较,最后将最小的元素,排到序列的第i位。
public class SelectSort { public static void main(String[] args) { int[] array = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 }; SelectSort.sort(array); System.out.println("排序后数组:" + Arrays.toString(array)); } // 每次从数组中选择最小的数值,放置在已经排序数据的后面,直到全部排序结束为止 public static void sort(int[] a) { for (int i = 0; i < a.length - 1; i++) { int index = i; for (int j = i + 1; j < a.length; j++) { // 记录最小数的数组索引 if (a[index] > a[j]) { index = j; } } // 数组值交换 if (i != index) { a[i] = a[i] + a[index]; a[index] = a[i] - a[index]; a[i] = a[i] - a[index]; } } } }
3.算法分析
时间复杂度:选择排序的比较次数与序列的初始状态无关,其比较次数总是n(n−1)2\frac{n(n-1)}{2},交换操作次数位于0到(n−1)0到(n-1)之间,当序列为正序时,元素的交换次数为0,当序列为反序时,元素的交换次数为3(n−1)3(n-1)。
因此,选择排序的时间复杂度为O(n2)O(n^2)。
算法稳定性:
对于序列【2】【1】【1】,第一次遍历第一个元素【2】和最后一个元素【1】发生位置交换,原序列中两个【1】的前后位置发生改变,因此选择排序是一种不稳定的排序算法。
相关文章推荐
- Java基础--面向对象(内部类、异常)
- 使用eclipse创建java程序可执行jar包
- 使用eclipse创建java程序可执行jar包
- java实现ip地址与十进制数相互转换
- 小码蚁java学习日记——起航篇
- java Collection
- 如何禁用Eclipse的Validating
- java、javac -version不一致(java编译及运行环境不一致)的环境变量设置问题解决
- Java 工程师成神之路
- java中路径的问题
- 基于JAVA代码 获取手机基本信息(本机号码,SDK版本,系统版本,手机型号)
- java.util.ServiceLoader使用
- java学习笔记-02
- java web emoji表情显示
- Java工程师成神之路
- Java并行编程(parallel programming) 2
- Eclipse安装ADT插件速度慢的解决方法
- java虚拟机-运行时数据区域
- [转]在SpringMVC中获取request对象的几种方式
- Java的类锁和对象锁