概念:
选择排序是一种原地排序(in-place)算法。在一组元素中,规定(你的规定就是选择)在某一索引上的元素和其后面的相比是最大的值或最小的值。所需的操作只在需要时才执行。
算法核心:(有升序和降序两种排序,这里选择升序排序)
1. 从当前索引向后寻找最小值。
2. 用当前索引的元素和最小值交换。
3. 重复执行1.2。
图解:
给定一个序列: 6 8 1 4 5 3 7 2 按升序排序
1 8 6 4 5 3 7 2 (考虑索引位置 0~7 1为当前索引位置下的最小元素)
1 2 8 6 5 4 7 3 (考虑索引位置 1~7 2为当前索引位置下的最小元素)如此迭代
1 2 3 8 6 5 7 4 (考虑索引位置 2~7)
1 2 3 4 8 6 7 5 (考虑索引位置 3~7)
1 2 3 4 5 8 7 6 (考虑索引位置 4~7)
1 2 3 4 5 6 8 7 (考虑索引位置 5~7)
1 2 3 4 5 6 7 8 (考虑索引位置 6~7)
代码:
//选择排序:选择某一位置,保证在此位置下,与后面的元素相比,它都是最大或最小的元素
static void selectionSort(int[] array){
//min表示:和后面的与元素相比,处于min位置的元素最小。
int min = 0,temp;
//最坏情况下需要排序的次数 array.length-1
for (int i = 1; i < array.length; i++) {
//需要排序的具体元素
for (int j = i; j < array.length; j++) {
/**
* 请注意看下面这层if逻辑判断,这是选择排序的精髓所在。
* 即原地排序,无论什么时刻,我都在这原地呆着,保证我(array[min])是最小的元素,
* 后面的元素你们来和我比较,我不动。如果值比我小,那么就把你的值复制给我,
* 你把我的值拿走,如此迭代,比较到最后一个元素为止。
*/
if(array[min] > array[j]){
temp = array[min];
array[min] = array[j];
array[j] = temp;
}
}
min++;
}
}
测试:
在控制台输入一个序列:
6 8 1 4 5 3 7 2
结果:
这是第1次排列:1 8 6 4 5 3 7 2
这是第2次排列:1 2 8 6 5 4 7 3
这是第3次排列:1 2 3 8 6 5 7 4
这是第4次排列:1 2 3 4 8 6 7 5
这是第5次排列:1 2 3 4 5 8 7 6
这是第6次排列:1 2 3 4 5 6 8 7
这是第7次排列:1 2 3 4 5 6 7 8
排序后的数组元素:1,2,3,4,5,6,7,8