3.选择排序
2015-10-23 22:16
155 查看
3.选择排序
选择排序前言
实现思路
模拟走位
实现代码
运行
前言
选择排序的含义就是因为每一次最内层for走一趟都会选择出一个最大或最小的数。实现思路
比如有N个数,开始先选取第一个数( i= 0 )作为基准数。然后抛开这个数以以前的数,右边的数( i+1 To n-1 )走一趟for,找出最小(最大也行,看你是要升序还是降序),然后拿到这个最小的数,和基准数交换。然后下一次又重新定位基准数 i + 1,继续走右边的数一趟,找到最值,继续交换…….如此反复。模拟走位
初始数组: [38, 17, 16, 16, 7, 31, 39, 32, 2, 11]i = 0 :[ 2 , 17 , 16 , 16 , 7 , 31 , 39 , 32 , 38 , 11 ] ( 0th [38]<->8th [2] )
i = 1 :[ 2 , 7 , 16 , 16 , 17 , 31 , 39 , 32 , 38 , 11 ] ( 1st [17]<->4th [7] )
i = 2 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 2nd [11]<->9th [16] )
i = 3 :[ 2 , 7 , 11 , 16 , 17 , 31 , 39 , 32 , 38 , 16 ] ( 无需交换 )
i = 4 :[ 2 , 7 , 11 , 16 , 16 , 31 , 39 , 32 , 38 , 17 ] ( 4th [17]<->9th [16] )
i = 5 :[ 2 , 7 , 11 , 16 , 16 , 17 , 39 , 32 , 38 , 31 ] ( 5th [31]<->9th [17] )
i = 6 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 6th [39]<->9th [31] )
i = 7 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )
i = 8 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )
i = 9 :[ 2 , 7 , 11 , 16 , 16 , 17 , 31 , 32 , 38 , 39 ] ( 无需交换 )
总结:选择排序随着 i 的 增大,比较次数也相应的减少了,无论数组是否有序,都会从 数组的开始 到 数组结束进行一次比较。次数也是固定的 n + (n-1) + … + 2 + 1,而交换的次数也和初始化数组的排序有关。
所以:最坏的情况是,n次;最好的情况是,0次。
实现代码
public <T extends Comparable<T>> T[] selectionSorting(T[] array, boolean ascend) { // 取得数组长度 int len = array.length; //逐个选择比较 for (int i = 0; i < len; i++) { int selected = i; /** * 与选择后的 其他元素比较 * Comparable.compareTo() 方法 * -1 : 小于 * 0 : 等于 * 1 : 大于 */ for (int j = i + 1; j < len; j++) { int compare = array[j].compareTo(array[selected]); /** * 如果 * array[j] != array[selected] * 并且 * array[j] 小于 array[selected] * 都成立的时候 */ if ((compare != 0 && compare < 0) == ascend) { selected = j; } } /** * 基准数 和 被选择的交换 * 当然要是没找到选择的数,那么被选择数一直没变是i * 也就是基准数自己和自己的交换 */ T t = array[i]; array[i] = array[selected]; array[selected] = t; System.out.print("i = " + i + " array = "); for (T data : array) { System.out.print(data + " "); } System.out.println(""); } return array; }
运行
public static void main(String[] args) { /** * 选择排序 */ SelectionSort selectionSorting = new SelectionSort(); Integer[] object = {38, 17, 16, 16, 7, 31, 39, 32, 2, 11}; System.out.println("\n选择排序\n"); Integer[] result = selectionSorting.selectionSorting(object, true); System.out.println("\n选择排序\n"); for (int i : result) { System.out.print(i + " "); } }
相关文章推荐
- 文件遍历排序函数
- C#选择排序法实例分析
- C#插入法排序算法实例分析
- C#实现Datatable排序的方法
- SQLSERVER的排序问题结果不是想要的
- Windows Powershell排序和分组管道结果
- C#通过IComparable实现ListT.sort()排序
- C#选择法排序实例分析
- SQL学习笔记四 聚合函数、排序方法
- C#对list列表进行随机排序的方法
- 一根网线内的8根线哪4根是传输数据的,哪四根是防干扰的
- C#折半插入排序算法实现方法
- SQL进行排序、分组、统计的10个新技巧分享
- C++实现位图排序实例
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)
- PHP下对数组进行排序的函数
- PHP数组排序之sort、asort与ksort用法实例
- php通过asort()给关联数组按照值排序的方法