2021-10-25

算法 专栏收录该内容
1 篇文章 0 订阅

优化选择排序

选择排序的思想:第一次外层循环中找出数组中的最小值,放到数组最前端,接下来要遍历的长度就是[1,arr.length-1],(本身可遍历的是[0,arr.length-1]),第二次下来就是[2,arr.length-1]…

优化思想:在一次外层外层循环中找出最小值和最大值,将最小值放到数组开头,将最大值放到数组末尾,这样一次循环之后数组可遍历的长度是[1,arr.length-2],效率比起原来有所提升。

看优化后代码:

public class Selection {

    //优化选择排序,一次i循环找出最小值和最大值。
    public static void main(String[] args) {
        int arr[] = {5,3,2,1,4,7,9,8,6};
        int al = arr.length-1;
        for (int i = 0;i<al;i++){
            for(int e = i+1;e<al-i;e++){
                int temp;
				if(arr[i]>arr[e]){
                    temp = arr[i];
                    arr[i] = arr[e];
                    arr[e] = temp;
                }
                if(arr[al-i]<arr[al-e]){
                    temp = arr[al-i];
                    arr[al-i] = arr[al-e];
                    arr[al-e] = temp;
                }
            }
           
        }
        //打印数组
        System.out.print("[");
        for(int j = 0;j<arr.length;j++){
            if(j!=arr.length-1)
            System.out.print(arr[j]+",");
            else
                System.out.print(arr[j]);
        }
        System.out.print("]");
    }
}

优化前:

 public static void main(String[] args) {
        int arr[] = {5,3,2,1,4,7,9,8,6};
        int al = arr.length-1;
        for (int i = 0;i<al;i++){
            for(int e = i+1;e<al-1;e++){
                int temp;
				if(arr[i]>arr[e]){
                    temp = arr[i];
                    arr[i] = arr[e];
                    arr[e] = temp;
                }
            }
        }
        //打印数组
        System.out.print("[");
        for(int j = 0;j<arr.length;j++){
            if(j!=arr.length-1)
            System.out.print(arr[j]+",");
            else
                System.out.print(arr[j]);
        }
        System.out.print("]");
    }
}

将两个代码分别用两个线程执行,算出它们的排序时间
上代码:

public class Selection {

    //优化选择排序,一次i循环找出最小值和最大值。
    public static void main(String[] args) {

        Thread thread1 = new Thread(()->{
            System.out.println(Thread.currentThread()+"的执行时间是"+原始());
        });
        Thread thread2 = new Thread(()->{
            System.out.println(Thread.currentThread()+"的执行时间是"+优化());
        });
        thread1.setName("线程1");
        thread2.setName("线程2");
        thread1.start();
        thread2.start();
    }
		
	//创建无序数组
    public static int[] getArray(){
        int[] arr = new int[10000];
        Random random = new Random(500000);
            for (int i = 0;i<10000;i++){
                arr[i] = random.nextInt();
            }
            return arr;
    }

    public static Long 原始(){
        int arr[] = getArray();

        int al = arr.length-1;
        Long time = System.currentTimeMillis();
        for (int i = 0;i<al;i++){

            for(int e = i+1;e<al-1;e++){

                int temp;
				if(arr[i]>arr[e]){
                    temp = arr[i];
                    arr[i] = arr[e];
                    arr[e] = temp;
                }
            }
        }
        return System.currentTimeMillis()-time;
    }

    public static Long 优化(){
        int arr[] = getArray();

        int al = arr.length-1;
        Long time = System.currentTimeMillis();
        for (int i = 0;i<al;i++){

            for(int e = i+1;e<al-i;e++){

                int temp;
				if(arr[i]>arr[e]){
                    temp = arr[i];
                    arr[i] = arr[e];
                    arr[e] = temp;
                }
                if(arr[al-i]<arr[al-e]){
                    temp = arr[al-i];
                    arr[al-i] = arr[al-e];
                    arr[al-e] = temp;
                }
            }
        }
        return System.currentTimeMillis()-time;
    }

对500个数据排序结果图
在这里插入图片描述在这里插入图片描述在这里插入图片描述 对5000个数据进行排序结果图
在这里插入图片描述在这里插入图片描述在这里插入图片描述对50000个数据进行排序 int[] arr = new int[50000];在这里插入图片描述在这里插入图片描述对200000数据进行排序(50w等的时间太长了)
在这里插入图片描述在这里插入图片描述![在这里插入图片描述](https://img-blog.csdnimg.cn/3f9e9f58bafd43bdba0c2880eebbe577.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5LiN5aS45byg5oCV5L2g5LiN55u45L-h,size_15,color_FFFFFF,t_70,g_se,x_16

可以看出优化过后的算法,确实起到了优化的作用,但是仅限于大数据量,因为小数据量来说,创建变量分配内存之类的,会造成一些影响,而且我只是在原来的时间上做了优化,空间优化和不稳定优化没有涉及到,若有不正之处,请谅解和批评指正,不胜感激!

  • 1
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值