选择排序算法

130 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情

本文系作者 不太自律的程序猿原创,转载请私信并在文章开头附带作者和原文地址链接。

选择排序算法

选择排序是一种简单直观的排序算法

算法思路

从小到大排序为例,首先在未排序序列中找到最小元素,存放在排序序列的起始位置,然后,再从剩余未排序序列元素中继续寻找最小元素,然后放到已排序序列的末尾。以此类推,知直到所有元素均排序完毕。

image.png

假设一开始的数组为:{8,1,2,7,6,5,4,3}

此时数组中未排序的值中最小值为1,和数组中的第一个位置的8进行交换

得到的数组为:{1,8,2,7,6,5,4,3}

此时数组中未排序的值中最小值为2,和数组中的第二个位置的8进行交换

得到的数组为:{1,2,8,7,6,5,4,3}

此时数组中未排序的值中最小值为3,和数组中的第三个位置的8进行交换

得到的数组为:{1,2,3,7,6,5,4,8}

此时数组中未排序的值中最小值为4,和数组中的第四个位置的7进行交换

得到的数组为:{1,2,3,4,6,5,7,8}

此时数组中未排序的值中最小值为5,和数组中的第六个位置的6进行交换

得到的数组为:{1,2,3,4,5,6,7,8}

后续发现最小值正好对应上排序的位置,后续不需要进行重复交换

public static void selectSort(int[] arr){
        for(int i=0;i<arr.length;i++){
                int minIndex=i;
                for(int j = i;j<arr.length;j++){
                        if(arr[j]<arr[min_index]){
                              minIndex=j;
                        }
               }
               if(i!=minIndex){
                   swap(arr,i,minIndex);
               }
        }
}
        
/*
 * 调换数组中指定两个位置的数据
 */
private static void swap(int[]arr,int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
}      


public static void main(String[] args) {
        int[] arr = {8,1,2,7,6,5,4,3};
        System.out.println("排序前:"+Arrays.toString(arr));
        selectSort(arr);
        System.out.println("排序后:"+Arrays.toString(arr));
}

1654574163267.png

算法性能分析

时间复杂度

选择排序的时间复杂度不像前面几种排序方法那样,前面几种排序方法的时间复杂度不是一眼就能看出来的,而是要通过推导计算才能得到的。一般会涉及到递归和完全二叉树,所以推导也不是那么容易。但是选择排序就不一样了,你可以很直观的看出选择排序的时间复杂度:就是两个循环消耗的时间;

比较时间:T = (n-1))+ (n -2)+(n - 3).... + 1; ===>> T = [n*(n-1) ] / 2;

交换时间:最好的情况全部元素已经有序,则 交换次数为0;最差的情况,全部元素逆序,就要交换 n-1 次;

所以最优的时间复杂度和最差的时间复杂度和平均时间复杂度都为 :O(n^2)

空间复杂度

由于仅使用常数个辅助单元,故空间复杂度为O(1)

感谢诸君的观看,文中如有纰漏,欢迎在评论区来交流。如果这篇文章帮助到了你,欢迎点赞👍关注。