2-1 选择排序的实现与迭代

博客围绕算法实现展开,介绍了两种实现方式,探讨了原地排序问题。针对实现中存在的问题进行优化,如使用泛型和排序接口。还对时间复杂度 O(n^2) 进行验证,结果显示时间 2 是时间 1 的 100 倍。
思路

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zc72l5tw-1610468286438)(AD9015E404F44105AB92FB50917FA297)]

时间复杂度 O(n^2)

【实现1】

3 可否进行原地排序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KyeQv9aq-1610468286441)(86A4393B208E4DBD9842E78BFA1525A8)]

    public static void sort(int[] data){
        // arr[0..i)是有序的; arr[i..n)是无序的
        for (int i = 0; i < data.length; i++) {
            // 选择[i..n) 中的最小值的索引
            int minIndex = i;
            for (int j = i; j < data.length; j++) {
                if(data[minIndex] >data[j]){
                    minIndex = j;
                }
            }
            if(i != minIndex){
                int temp = data[minIndex];
                data[minIndex] = data[i];
                data[i] = temp;
            }
        }
    }

【实现2】

问题
  • 1、要求适用于其他数据类型
  • 2、泛型的比较不能使用 > 和 <
优化
  • 1、使用泛型
  • 2、使用自然排序接口 Comparable 或 定制排序接口 Comparator
  • 2-1 如果使用Comparable接口,自定义类要实现Comparable接口 ,并重写comparaTO()方法
  • 2-2 如果使用Comparable接口,泛型继承Comparable接口 --> 表明该类型是可比较的
public static <E extends Comparable<E>> void sort(E[] data){

        for (int i = 0; i < data.length; i++) {

            int minIndex = i;
            for (int j = i; j < data.length; j++) {
                if(data[j].compareTo(data[minIndex]) < 0){
                    minIndex = j;
                }
            }
            if(i != minIndex){
                E temp = data[minIndex];
                data[minIndex] = data[i];
                data[i] = temp;
            }
        }
    }

验证时间复杂度 O(n^2)

public static void main(String[] args) {
        int [] dataSize = {10000,100000};
        for(int n:dataSize){
            Integer[] data = ArrayGenerator.generateRandomArray(n,n*100);
            long start = System.nanoTime();//纳秒

            sort(data);

            long end = System.nanoTime();
            double time = (end-start)/1000000000.0;
            System.out.println("n = "+ n + ":" + time + "s");
        }
    }
结果
时间2 是 时间1 的 100倍
n = 10000:0.0943812s
n = 100000:10.5438226s
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值