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 + " ");
}
}