排序算法(二) 选择排序及改进

选择排序

基本思想

冒泡排序中有一个缺点,比如,我们比较第一个数a1与第二个数a2的时候,只要a1比a2大就会交换位置,但是我们并不能确定a2是最小的元素,假如后面还有比它更小的,该元素还会与a2再次进行交换,而且这种交换有可能发生多次才能确定a2的最终位置。

选择排序可以避免这种耗费时间的交换操作,从第一个元素开始,扫描整个待排数组,找到最小的元素放之后再与第一个元素交换位置,然后再从第二个元素开始,继续寻找最小的元素与第二个元素交换位置,依次类推。


java实现:

public void xuanZe(int[] array){
        if(null == array)
            return;
        for (int i=0; i<array.length; i++){
            //System.out.println(this.toString(array));
            for(int j=i+1; j<array.length; j++){
                if(array[i]>array[j]){
                    int temp = array[i];
                    array[i] = array[j];
                    array[j] = temp;
                }
            }
        }

        display(array);
    }

算法分析

选择排序与冒泡排序一样,需要进行N*(N-1)/2次比较,但是只需要N次交换,当N很大时,交换次数的时间影响力更大,所以选择排序的时间复杂度为O(N2)。 

虽然选择排序与冒泡排序在时间复杂度属于同一量级,但是毫无疑问选择排序的效率更高,因为它的交换操作次数更少,而且在交换操作比比较操作的时间级大得多时,选择排序的速度是相当快的。 

选择排序的改进

传统的选择排序每次只确定最小值,根据改进冒泡算法的经验,我们可以对排序算法进行如下改进:每趟排序确定两个最值——最大值与最小值,这样就可以将排序趟数缩减一半。  

改进后的代码如下:

    public void xuanZe2(int[] array){
        if(null == array)
            return;

        int low = 0;
        int high = array.length - 1;
        int temp;
        while (low < high){
            //正向选出最小的
            for (int i=high; i>low; i--){
                if (array[i] < array[low]){ //如果比低位小  交换位置
                    temp = array[low];
                    array[low] = array[i];
                    array[i] = temp;
                }
            }
            low++;
            //反向选出最大的
            for (int i=low; i<high; i++){
                if(array[i] > array[high]){   //如果比高位大 交换位置
                    temp = array[high];
                    array[high] = array[i];
                    array[i] = temp;
                }
            }
            high--;

        }

        display(array);
    }

运行代码及结果:

public static void  main(String[] args){
        PaiXu paiXu = new PaiXu();
        int[] array = paiXu.newArr();
        System.out.println("排序前");
        paiXu.display(array);
  
        long start3 = System.currentTimeMillis();
        paiXu.xuanZe(array.clone());
        long end3 = System.currentTimeMillis();
        System.out.println("********xuanZe排序完成************用时:" + (end3 - start3));

        long start4 = System.currentTimeMillis();
        paiXu.xuanZe2(array.clone());
        long end4 = System.currentTimeMillis();
        System.out.println("********xuanZe排序完成************用时:" + (end4 - start4));
    }

排序前
11557 22454 45454 50034 9350 53520 2114 21991 83107 40298 68205 95242 56729 49019 61917 21325 5923 54646 35818 85341 57252 3607 81555 95431 55778 19753 35785 74473 63877 49503

排序后  
2 2 3 3 4 4 4 5 6 9 10 10 11 11 12 12 12 13 13 16 16 17 17 18 18 19 19 20 21 21
********xuanZe排序完成************用时:18075
2 2 3 3 4 4 4 5 6 9 10 10 11 11 12 12 12 13 13 16 16 17 17 18 18 19 19 20 21 21
********xuanZe排序完成************用时:9962


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 概述:排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    每天刷两次牙阅读 9,092评论 0 15
  • 概述 排序有内部排序和外部排序,内部排序是数据记录在内存中进行排序,而外部排序是因排序的数据很大,一次不能容纳全部...
    蚁前阅读 10,600评论 0 52
  • 走出去,看见未曾看见过的世界,这便是旅行的意义。 当飞机即将降落,可以鸟瞰整个普吉岛,那是一颗被热带植物覆盖着的...
    锦忐阅读 2,920评论 2 5
  • 2016.07.27 上周的一场大暴雨,不禁又让人想起了2012年的7.21暴雨。 当时最令人揪心的就是有人被困车...
    摹喵居士阅读 1,877评论 0 0
  • 书,是心灵的老师,是开启智慧的金钥匙,是我们飞向快乐的翅膀!我课余生活浸泡在书中! ...
    鸿雁长空阅读 2,481评论 0 3

友情链接更多精彩内容