思想
每次选择未排序元素中的最小值,将其放在最左边。
想象你打牌的时候,如果你手上有一堆牌,你每次找到最小的牌,然后将其出出来。手上的是未排序的牌,出出去的牌按顺序摆出来,就是已排序的。
比较耗时:第一次比较n,第二次比较n-1,以此类推
插入耗时:插入策略分为,移动选定元素前的元素,然后插入最小值;或者不断交换相邻元素,直到最小值到达所在位置;或者找到最小元素后,直接与需要排序的位置进行交换
前一个方案,只要复制一条语句即可,然后进行一次交换。第二种交换,每一次交换,需要三条语句。第三种,只需要一次交换。
实现
import java.util.Arrays;
public class SelectionSort {
public static void main(String[] args) {
int[] nums = {5, 7, 3, 2, 9, 4, 2, 6, 8};
selectSort(nums);
System.out.println(Arrays.toString(nums));
}
public static void selectSort(int[] nums){
//记录排序部分的最后索引值
for (int i = 0; i < nums.length; i++) {
// 记录未排序部分的开始值
int min_value = nums[i];
int min_index = i;
for (int j = i; j < nums.length; j++) {
// 找到未排序数组中的最小值及位置
if(nums[j]<min_value){
min_value = nums[j];
min_index = j;
}
}
// 找到了未排序数组中的最小值,然后跟要排序位置交换位置
nums[min_index] = nums[i];
nums[i] = min_value;
}
}
}
复杂度分析
从上面分析上,可以看到,时间消耗主要是在找到最小值上。
n+n-1+n-2+...
所以时间复杂度为O(n^2)
原文地址:https://www.cnblogs.com/zhouzhiyao/p/12527049.html
时间: 2024-10-04 01:41:27