1. 选择排序

思想

每次选择未排序元素中的最小值,将其放在最左边。

想象你打牌的时候,如果你手上有一堆牌,你每次找到最小的牌,然后将其出出来。手上的是未排序的牌,出出去的牌按顺序摆出来,就是已排序的。

比较耗时:第一次比较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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章