选择排序

基本思想(从小到大排序)

1.第一次从arr[0]~arr[n-1]中选取最小值,与arr[0]交换

2.第 i 次从 arr[i-1]~arr[n-1]中选取最小值, 与 arr[i-1]交换

3.第 n-1 次从 arr[n-2]~arr[n-1]中选取最小值,与 arr[n-2]交换

4.总共通过 n-1 次, 得到一个按排序码从小到大排列的有序序列

 

实现思路

1.数组大小为n,总共有n-1轮排序,每一轮排序即为一次循环

2.假设当前数为最小数,和后面的数逐一比较,若有更小数,重新确定最小数,并得到其下标,继续遍历比较

3.遍历比较到最后,得到本轮最小数的值和下标,然后交换原假设最小数和实际最小数;若假设正确,则不交换

4.重复步骤2,步骤3,直到第n-1次

 

代码实现

public class SelectSort {//从小到大排序

    public static void selectSort(int[] array) {
        if (array == null || array.length <= 1) {
            return;
        }
        for (int i = 0; i < array.length - 1; i++) {//顺序遍历索引0到索引array.length-2下的值
            int minIndex = i;//假设最小值的索引
            int min = array[i];//假设最小值
            for (int j = i + 1; j < array.length; j++) {//顺序比较索引i+1到索引array.length-1下的值
                if (min > array[j]) {//存在比假设值小的值
                    min = array[j];//储存更小值
                    minIndex = j;//储存更小值的索引
                }
            }
            if (minIndex != i) {//没有找到比原假设的更小值,就不执行
                //更小值与假设最小值交换位置
                array[minIndex] = array[i];
                array[i] = min;
            }
        }
    }
}

 

特点

1、运行时间和输入无关

(1)为了找出最小的元素而扫描一遍数组并不能为下一遍扫描提供什么信息

(2)这种性质在某些情况下是缺点,因为使用选择排序的人可能会惊讶地发现,一个已经有序的数组或是主键全部相等的数组和一个元素随机排列的数组所用的排序时间竟然一样长

(3)其他算法会更善于利用输入的初始状态

2、数据移动是最少的

(1)每次交换都会改变两个数组元素的值,因此选择排序用了 N 次交换,交换次数和数组的大小是线性关系

(2)其他任何算法都不具备这个特征,大部分的增长数量级都是线性对数或是平方级别

 

对于长度为 N 的数组,选择排序需要大约 N2 / 2 次比较和 N 次交换

1、交换元素的代码写在内循环之外,每次交换都能排定一个元素,因此交换的总次数是 N,所以算法的时间效率取决于比较的次数

2、0 到 N - 1 的任意 i 都会进行一次交换和 N - 1 - i 次比较,因此总共有 N 次交换以及 (N - 1) + (N - 2) + …… + 2 + 1 = N * (N - 1) / 2 = N2 / 2 次比较

posted @   半条咸鱼  阅读(15)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示