您的位置:首页 > 其它

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

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  排序