选择排序java实现和用时测试

目录

一.原理分析 

二.java代码

三.代码解析部分

四.最好最坏情况分析

五.选择排序测试用时


一.原理分析 

选择排序所做的就是不断遍历数组记录未排序部分的最小值的元素的下标 然后将他和未排序部分 的第一个元素位置进行互换

如十元素数组值为 

3352 2369 4363 5814 7493 7934 2971 9917 7102 7603 

最开始未排序部分下标从0开始 也就是说需要找出未排序部分的最小值 将他和第一个元素互换 在这次操作过后

数组值变为

2369, 3352, 4363, 5814, 7493, 7934, 2971, 9917, 7102, 7603

此时第一个位置上已经放入正确元素 未排序部分下标从1开始 重复操作可得到结果为

这里的有个小毛病就是第几次是从0开始的这个不要在意哈 然后不用排序十次 在第九次的时候数组已经排序好了 

二.java代码

 

 public static void Select_Sort(int []array)
    {
        //选择排序 每次遍历时候选择后面的最小数放在未排序部分的第一个位置
        for (int i=0;i<array.length-1;i++) {
            //首先记录 第一个值的下标
            int flag=i;
            for (int j = i + 1; j < array.length; j++) {
                //更新最小值下标
                if (array[flag]>array[j])
                    flag=j;
            }
            //将最小值的元素和未排序部分的第一个值相交换
            int temp=array[flag];
            array[flag]=array[i];
            array[i]=temp;
        }
    }

 

三.代码解析部分

外层循环的效果是每次循环都会使数组下标为i的部分放入正确的元素
        for (int i=0;i<array.length-1;i++) {

变量flag的作用是记录最小值的下标 初始下标为i

未排序部分的下标用变量i保存

配合内层循环就可以在外层循环的每一次 都能记录到未排序部分的最小值下标

              int flag=i;
            for (int j = i + 1; j < array.length; j++) {
                //更新最小值下标
                if (array[flag]>array[j])
                    flag=j;
            }

最后一部分就是最小值和未排序部分的第一个元素互换

        int temp=array[flag];
        array[flag]=array[i];
        array[i]=temp;
    }
}

从而达到让数组有序

四.最好最坏情况分析

 

最坏情况就是 数组是逆序的 时间复杂度为O(^{n^{2}}

最好情况就是 数组已经是有序的了 时间复杂度也是  O(^{n^{2}})  就算有序内存循环依旧会继续

平均时间复杂度  O(^{n^{2}}

五.选择排序测试用时

排序耗时分析需要用到一个方法 该方法是System类的静态方法 返回值是Long型的具体是

System.currentTimeMillis();返回值是从1970年1月1日到现在的毫秒值 

        long begin = System.currentTimeMillis();
        Sort.Select_Sort(array);
        long end=System.currentTimeMillis();
        // 记录 多少毫秒
        long ms=(end-begin);
        System.out.println("\n运行时间排序"+max+"数字总共耗时"+ms+"毫秒");


这样就可以获取到允许排序算法的时间长度

数据均为自己测试所得 不同计算机排序时间有所差异

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值