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

选择排序

基本思想

冒泡排序中有一个缺点,比如,我们比较第一个数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


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容

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