国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

選擇排序就這么簡(jiǎn)單

wua_wua2012 / 1698人閱讀

摘要:選擇排序就這么簡(jiǎn)單從上一篇已經(jīng)講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫(xiě)出選擇排序的代碼,然后就通過(guò)面試了如果我寫(xiě)得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。

選擇排序就這么簡(jiǎn)單

從上一篇已經(jīng)講解了冒泡排序了,本章主要講解的是選擇排序,希望大家看完能夠理解并手寫(xiě)出選擇排序的代碼,然后就通過(guò)面試了!如果我寫(xiě)得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。

選擇排序介紹和穩(wěn)定性說(shuō)明

來(lái)源百度百科:

選擇排序(Selection sort)是一種簡(jiǎn)單直觀的排序算法。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,存放在序列的起始(末尾)位置,直到全部待排序的數(shù)據(jù)元素排完。選擇排序是不穩(wěn)定的排序方法(比如序列[5, 5, 3]第一次就將第一個(gè)[5]與[3]交換,導(dǎo)致第一個(gè)5挪動(dòng)到第二個(gè)5后面)。

上面提到了選擇排序是不穩(wěn)定的排序方法,那我們的冒泡排序是不是穩(wěn)定的排序方法呢?穩(wěn)定的意思指的是什么呢?

判斷某排序算法是否穩(wěn)定,我們可以簡(jiǎn)單理解成:排序前2個(gè)相等的數(shù)其在序列的前后位置順序和排序后它們兩個(gè)的前后位置順序相同

如果相同,則是穩(wěn)定的排序方法。

如果不相同,則是不穩(wěn)定的排序方法

如果排序前的數(shù)組是[3,3,1],假定我們使用選擇排序的話,那第一趟排序后結(jié)果就是[1,3,3]。這個(gè)數(shù)組有兩個(gè)相同的值,它倆在array[0]array[1],結(jié)果經(jīng)過(guò)排序,array[0]的跑到了array[2]上了。

那么這就導(dǎo)致:2個(gè)相等的數(shù)其在序列的前后位置順序和排序后它們兩個(gè)的前后位置順序不相同,因此,我們就說(shuō)它是不穩(wěn)定的

再回到上面的問(wèn)題,上一篇說(shuō)講的冒泡排序是穩(wěn)定的,主要原因是:倆倆比較的時(shí)候,沒(méi)有對(duì)相等的數(shù)據(jù)進(jìn)行交換(因?yàn)闆](méi)必要)。因此它不存在2個(gè)相等的數(shù)其在序列的前后位置順序和排序后它們兩個(gè)的前后位置順序不相同。

那么穩(wěn)定排序的好處是什么?

參考知乎回答@獨(dú)行俠的回答:

如果我們只對(duì)一串?dāng)?shù)字排序,那么穩(wěn)定與否確實(shí)不重要,因?yàn)橐淮當(dāng)?shù)字的屬性是單一的,就是數(shù)字值的大小。但是排序的元素往往不只有一個(gè)屬性,例如我們對(duì)一群人按年齡排序,但是人除了年齡屬性還有身高體重屬性,在年齡相同時(shí)如果不想破壞原先身高體重的次序,就必須用穩(wěn)定排序算法.

很清晰的指出,只有當(dāng)在“二次”排序時(shí)不想破壞原先次序,穩(wěn)定性才有意義

參考資料:

https://www.zhihu.com/question/46809714/answer/281361290

http://tieba.baidu.com/p/872860935

http://www.cnblogs.com/codingmylife/archive/2012/10/21/2732980.html

一、第一趟排序

它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最小(或最大)的一個(gè)元素,存放在序列的起始(末尾)位置,直到全部待排序的數(shù)據(jù)元素排完

首先,我們創(chuàng)建數(shù)組,找到它最大的值(這就很簡(jiǎn)單了):


    int[] arrays = {2, 3, 1, 4, 3, 5, 1, 6, 1, 2, 3, 7, 2, 3};

    //假定max是最大的
    int max = 0;


    for (int i = 0; i < arrays.length; i++) {
        if (arrays[i] > max) {
            max = arrays[i];
        }
    }
        

隨后這個(gè)最大的數(shù)和數(shù)組末尾的數(shù)進(jìn)行交換:

    //使用臨時(shí)變量,讓兩個(gè)數(shù)互換
    int temp;
    temp = arrays[11];
    arrays[11] = arrays[13];
    arrays[13] = temp;

那么經(jīng)過(guò)第一趟排序,我們的最大值已經(jīng)到了數(shù)組的末尾了。

二、第二趟排序

再次從數(shù)組獲取最大的數(shù)(除了已經(jīng)排好的那個(gè)):

    int max2 = 0;
    for (int i = 0; i < (arrays.length - 1); i++) {
        if (arrays[i] > max2) {
            max2 = arrays[i];
        }
    }

    System.out.println(max2);

再將獲取到的最大值與數(shù)組倒數(shù)第二位交換:

    temp = arrays[7];
    arrays[7] = arrays[12];
    arrays[12] = temp;

經(jīng)過(guò)第二次排序,已經(jīng)能夠?qū)?shù)組最大兩個(gè)數(shù)進(jìn)行排序了

三、代碼簡(jiǎn)化

從前兩趟排序其實(shí)我們就可以摸出規(guī)律了:

一個(gè)數(shù)組是需要n-1趟排序的(因?yàn)橹钡绞O乱粋€(gè)元素時(shí),才不需要找最大值)

每交換1次,再次找最大值時(shí)就將范圍縮小1

查詢(xún)當(dāng)前趟數(shù)最大值實(shí)際上不用知道最大值是多少(上面我查出最大值,還要我手動(dòng)數(shù)它的角標(biāo)),知道它的數(shù)組角標(biāo)即可,交換也是根據(jù)角標(biāo)來(lái)進(jìn)行交換

第一趟:遍歷數(shù)組14個(gè)數(shù),獲取最大值,將最大值放到數(shù)組的末尾[13]
第二趟:遍歷數(shù)組13個(gè)數(shù),獲取最大值,將最大值放到數(shù)組倒數(shù)第二位[12]

....

數(shù)組有14個(gè)數(shù),需要13趟排序。


    //記錄當(dāng)前趟數(shù)的最大值的角標(biāo)
    int pos ;

    //交換的變量
    int temp;


    //外層循環(huán)控制需要排序的趟數(shù)
    for (int i = 0; i < arrays.length - 1; i++) {

        //新的趟數(shù)、將角標(biāo)重新賦值為0
        pos = 0;

        //內(nèi)層循環(huán)控制遍歷數(shù)組的個(gè)數(shù)并得到最大數(shù)的角標(biāo)
        for (int j = 0; j < arrays.length - i; j++) {
            
            if (arrays[j] > arrays[pos]) {
                pos = j;
            }

        }
        //交換
        temp = arrays[pos];
        arrays[pos] = arrays[arrays.length - 1 - i];
        arrays[arrays.length - 1 - i] = temp;


    }

    System.out.println("公眾號(hào)Java3y" + arrays);

四、選擇排序優(yōu)化

博主暫未想到比較好的優(yōu)化方法,如果看到這篇文章的同學(xué)知道有更好的優(yōu)化方法或者代碼能夠?qū)懙酶玫牡胤剑瑲g迎在評(píng)論下留言哦!

查到的這篇選擇排序優(yōu)化方法,感覺(jué)就把選擇排序變了個(gè)味,大家也可以去看看:

他是同時(shí)獲取最大值和最小值,然后分別插入數(shù)組的首部和尾部(這跟選擇排序的原理好像差了點(diǎn),我也不知道算不算)

http://www.cnblogs.com/TangMoon/p/7552921.html

五、擴(kuò)展閱讀

C語(yǔ)言實(shí)現(xiàn)

          int findMaxPos ( int arr[], int n)
        {
            int max = arr[0];
            int pos = 0; 
            for (int i = 1; i < n; i++) {
                if (arr[i] > max) {
                    max = arr[i];
                    pos = i;
                }
            }
            return pos;
        }

        void selectionSort ( int arr[], int n)
        {
            while (n > 1) 
            {
                int pos = findMaxPos(arr, n);
                int temp = arr[pos];
                arr[pos] = arr[n - 1];
                arr[n - 1] = temp;
                n--;//
            }
        }

        int main ()
        {
            int arr[] = {5, 32, 7, 89, 2, 3, 4, 8, 9};
            selectionSort(arr, 9);
            for (int i = 0; i < 9; i++)
                cout << arr[i] << endl;
        }
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/68850.html

相關(guān)文章

  • 快速排序這么簡(jiǎn)單

    摘要:快速排序的介紹來(lái)源百度百科快速排序由在年提出。快速排序是面試出現(xiàn)的可能性比較高的,也是經(jīng)常會(huì)用到的一種排序,應(yīng)該重點(diǎn)掌握。前面一個(gè)章節(jié)已經(jīng)講了遞歸了,那么現(xiàn)在來(lái)看快速排序就非常簡(jiǎn)單了。 快速排序就這么簡(jiǎn)單 從前面已經(jīng)講解了冒泡排序、選擇排序、插入排序了,本章主要講解的是快速排序,希望大家看完能夠理解并手寫(xiě)出快速排序的代碼,然后就通過(guò)面試了!如果我寫(xiě)得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 ...

    Faremax 評(píng)論0 收藏0
  • 八大基礎(chǔ)排序總結(jié)

    摘要:不斷執(zhí)行這個(gè)操作代碼實(shí)現(xiàn)快速排序用遞歸比較好寫(xiě)如果不太熟悉遞歸的同學(xué)可到遞歸就這么簡(jiǎn)單。 前言 大概花了一周的時(shí)間把八大基礎(chǔ)排序過(guò)了一遍,這篇博文主要是用來(lái)回顧一下八大基礎(chǔ)排序的要點(diǎn)和一些總結(jié)~ 回顧: 冒泡排序就這么簡(jiǎn)單 選擇排序就這么簡(jiǎn)單 插入排序就這么簡(jiǎn)單 快速排序就這么簡(jiǎn)單 歸并排序就這么簡(jiǎn)單 堆排序就這么簡(jiǎn)單 希爾排序就這么簡(jiǎn)單 基數(shù)排序就這么簡(jiǎn)單 總的來(lái)說(shuō):快速排序是用...

    maochunguang 評(píng)論0 收藏0
  • 歸并排序這么簡(jiǎn)單

    摘要:歸并排序就這么簡(jiǎn)單從前面已經(jīng)講解了冒泡排序選擇排序插入排序快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫(xiě)出歸并排序快速排序的代碼,然后就通過(guò)面試了如果我寫(xiě)得有錯(cuò)誤的地方也請(qǐng)大家在評(píng)論下指出。 歸并排序就這么簡(jiǎn)單 從前面已經(jīng)講解了冒泡排序、選擇排序、插入排序,快速排序了,本章主要講解的是歸并排序,希望大家看完能夠理解并手寫(xiě)出歸并排序快速排序的代碼,然后就通過(guò)面試了!如果...

    ingood 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫(xiě)的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...

    KevinYan 評(píng)論0 收藏0
  • 排序這么簡(jiǎn)單

    摘要:一堆排序介紹來(lái)源百度百科堆排序是指利用堆積樹(shù)堆這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。 一、堆排序介紹 來(lái)源百度百科: 堆排序(Heapsort)是指利用堆積樹(shù)(堆)這種數(shù)據(jù)結(jié)構(gòu)所設(shè)計(jì)的一種排序算法,它是選擇排序的一種。可以利用數(shù)組的特點(diǎn)快速定位指定索引的元素。堆分為大根堆和小根堆,是完全二叉樹(shù)。 前面我已經(jīng)有二叉樹(shù)入門(mén)的文章了,當(dāng)時(shí)講解的是二叉查找樹(shù),那上面所說(shuō)的完全二...

    NickZhou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

wua_wua2012

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<