本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动连接java
在无序序列中查找最小(大)元素,从头至尾扫描序列,查找最小的元素,和第一个元素交换位置,再从剩余未排序元素中查找最小(大)元素,而后存放到已排序序列的末尾,继续这种选择和交换方式,直到全部元素都排序完成。算法
原始序列:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36数组
结果:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36markdown
2.从无序序列中查找最小的元素为2,将2跟无序序列第一个元素交换,此时产生一个含有一个元素的有序序列,而无序序列元素个数减一app
结果:有序:{2} ,无序:{6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}post
3.从无序序列中查找最小的元素为6,将6跟无序序列第一个元素交换,此时有序序列元素有两个,而无序序列元素个数减一ui
结果:有序:{2,6},无序:{11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}url
4.从无序序列中查找最小的元素为8,将8跟无序序列第一个元素交换,此时有序序列元素有三个,而无序序列元素个数减一spa
结果:有序:{2,6,8},无序:{11, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}3d
...
从无序序列中查找最小的元素为31,将31跟无序序列第一个元素交换,此时有序序列元素有12个,而无序序列元素个数减一
结果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31},无序:{49, 56, 36}
从无序序列中查找最小的元素为36,将36跟无序序列第一个元素交换,此时有序序列元素有13个,而无序序列元素个数减一
结果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36},无序:{56, 49}
从无序序列中查找最小的元素为49,将49跟无序序列第一个元素交换,此时有序序列元素有14个,而无序序列元素个数减一
结果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49},无序:{56}
最后通过选择排序后结果以下: 有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49, 56}
/** * @Description: 选择排序算法 * @Author Gxin * @Date 2021/5/26 **/
public class SelectionSort {
public static void selectionSort(int[] arr) {
if (arr.length < 2 || arr == null) {
return;
}
for (int i = 0; i < arr.length - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex;
}
System.out.println("第" + (i + 1) + "轮结束序列为:" + Arrays.toString(arr) + " ,最小值为" + arr[minIndex] + ",最小值下标为" + minIndex);
swap(arr, i, minIndex);
}
System.out.println("结果:" + Arrays.toString(arr));
}
private static void swap(int[] arr, int i, int minIndex) {
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
public static void main(String[] args) {
int[] arr = {31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36};
selectionSort(arr);
}
}
复制代码
结果和算法分析过程是同样,通过14轮比较后数组成为有序数组。
选择排序时间复杂度:O(N^2),使用选择排序对数据规模越小越好,好处是一次比较最须要换一次位置,缺点是效率慢,不稳定(好比11,8,11,6,10,第一遍选择第一个最小元素6会和11交换,那原序列中2个11的相对位置先后顺序被破坏了)