排序算法之选择排序 |Java 刷题打卡

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动连接java

算法原理

在无序序列中查找最小(大)元素,从头至尾扫描序列,查找最小的元素,和第一个元素交换位置,再从剩余未排序元素中查找最小(大)元素,而后存放到已排序序列的末尾,继续这种选择和交换方式,直到全部元素都排序完成。算法

算法分析

原始序列:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36数组

  1. 进行选择排序过程可分为有序和无序两个部分,起始都是无序序列

结果: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}

思路

  • 选择初始位置的值和其后的值一一比较,找到最小值,记录最小值的下标
  • 找到最小值后,无序序列第i个位置的值和最小值的位置交换
  • 遍历到最后一个元素为止,结束排序

算法代码

/** * @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);
    }
}
复制代码

结果

image.png

结果和算法分析过程是同样,通过14轮比较后数组成为有序数组。

总结

选择排序时间复杂度:O(N^2),使用选择排序对数据规模越小越好,好处是一次比较最须要换一次位置,缺点是效率慢,不稳定(好比11,8,11,6,10,第一遍选择第一个最小元素6会和11交换,那原序列中2个11的相对位置先后顺序被破坏了)

相关文章
相关标签/搜索