个人博客:www.hellocode.top
Java知识导航:Java-Navigate
CSDN:HelloCode.
知乎:HelloCode
掘金:HelloCode
⚡如有问题,欢迎指正,一起学习~~
选择排序是一种简单但低效的排序算法,其基本思想是每次从待排序序列中选出最小(或最大)的元素,然后将其放置在已排序序列的末尾(或开头)。通过逐步选择出最小(或最大)元素,将其插入到已排序序列中,从而逐步构建有序序列。
和插入排序很像,区别就在于选择和插入,根据动画体会一下,选择排序的重点是选择出未排序中最小(大)的,不断的加入到已排序区中(选择对的元素插入已排序区末尾)
代码和插入排序可以对比着来写,也很简单,两层for循环,外层用来控制已排序的元素个数(选择好的待排序元素该放入的位置),内层for用来遍历选择出最小(大)的元素,具体代码如下:
/**
* @author HelloCode
* @blog https://www.hellocode.top
* @date 2023年08月09日 21:21
*/
public class SelectionSort {
public static void main(String[] args) {
int[] arr = {2, 12, 42, 13, 43, 85, 91, 23, 12, 4, 5, 8, 1, 9, 88, 66, 33, 123};
System.out.println("排序前:"+ Arrays.toString(arr));
selectionSort(arr);
System.out.println("排序后:"+ Arrays.toString(arr));
}
public static void selectionSort(int[] arr){
// 两层for循环,外层i代表已排序的元素个数
for(int i = 0; i < arr.length - 1; i++){
// 内层 for 进行选择,在待排序的元素中选择最小的进行排序
int min = i;
for(int j = i + 1; j < arr.length; j++){
if(arr[j] < arr[min]){
// j更小,更新min
min = j;
}
}
// 将选择出的最小元素插入已排序元素中
int temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
}
测试:
排序前:[2, 12, 42, 13, 43, 85, 91, 23, 12, 4, 5, 8, 1, 9, 88, 66, 33, 123]
排序后:[1, 2, 4, 5, 8, 9, 12, 12, 13, 23, 33, 42, 43, 66, 85, 88, 91, 123]
虽然选择排序的时间复杂度不容易通过优化得到显著的提升,但一些小优化可以改善算法的实际性能。
由于其低效性,选择排序在实际应用中较少使用。在需要排序的数据规模较小时,选择排序可能是一个合理的选择。然而,对于大规模数据,其他高效的排序算法(如快速排序、归并排序)通常更为适用。选择排序适用于教学和学习排序算法的基本原理,但在实际应用中,通常会选择更优的排序算法。
当使用选择排序时,应特别注意其时间和空间复杂度的说明是基于固定的数据集。在实际情况中,选择排序的性能可能因为一些特定因素而有所不同,因此在特定情况下选择排序可能表现更好。