成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

插入排序就這么簡(jiǎn)單

Forest10 / 3415人閱讀

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

插入排序就這么簡(jiǎn)單

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

插入排序介紹

來源百度百科:

插入排序的基本操作就是將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)中,從而得到一個(gè)新的、個(gè)數(shù)加一的有序數(shù)據(jù),算法適用于少量數(shù)據(jù)的排序,時(shí)間復(fù)雜度為O(n^2)。是穩(wěn)定的排序方法。

將一個(gè)數(shù)據(jù)插入到已經(jīng)排好序的有序數(shù)據(jù)

將要排序的是一個(gè)亂的數(shù)組int[] arrays = {3, 2, 1, 3, 3};

在未知道數(shù)組元素的情況下,我們只能把數(shù)組的第一個(gè)元素作為已經(jīng)排好序的有序數(shù)據(jù),也就是說,把{3}看成是已經(jīng)排好序的有序數(shù)據(jù)

一、第一趟排序

用數(shù)組的第二個(gè)數(shù)與第一個(gè)數(shù)(看成是已有序的數(shù)據(jù))比較

如果比第一個(gè)數(shù)大,那就不管他

如果比第一個(gè)數(shù)小,將第一個(gè)數(shù)往后退一步,將第二個(gè)數(shù)插入第一個(gè)數(shù)去


    int temp;
    if (arrays[1] > arrays[0]) {
        //如果第二個(gè)數(shù)比第一個(gè)數(shù)大,直接跟上

    } else {
        //如果第二個(gè)數(shù)比第一個(gè)數(shù)小,將第一個(gè)數(shù)后退一個(gè)位置(將第二個(gè)數(shù)插進(jìn)去)
        temp = arrays[1];
        arrays[1] = arrays[0];
        arrays[0] = temp;

    }

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

二、第二趟排序

用數(shù)組的第三個(gè)數(shù)與已是有序的數(shù)據(jù){2,3}(剛才在第一趟排的)比較

如果比2大,那就不管它

如果比2小,那就將2退一個(gè)位置,讓第三個(gè)數(shù)和1比較

如果第三個(gè)數(shù)比1大,那么將第三個(gè)數(shù)插入到2的位置上

如果第三個(gè)數(shù)比1小,那么將1后退一步,將第三個(gè)數(shù)插入到1的位置上

    //第二趟排序--------------------

    if (arrays[2] > arrays[1]) {
        //如果第三個(gè)數(shù)比第二個(gè)數(shù)大,直接跟上

    } else {
        //如果第三個(gè)數(shù)比第二個(gè)數(shù)小,將第二個(gè)數(shù)往后退一個(gè)位置,讓第三個(gè)數(shù)跟第一個(gè)數(shù)比
        temp = arrays[2];
        arrays[2] = arrays[1];

        //如果第三個(gè)數(shù)比第一個(gè)大,那就插入到第二個(gè)數(shù)中
        if (temp > arrays[0]) {
            arrays[1] = temp;
        } else {

            //如果第三個(gè)數(shù)比第一個(gè)小,將第三個(gè)數(shù)插入到第一個(gè)數(shù)前面
            int swapTemp = arrays[0];
            arrays[0] = temp;
            arrays[1] = swapTemp;

        }

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


....

三、簡(jiǎn)化代碼

從前兩趟排序我們可以摸出的規(guī)律:

首先將已排序的數(shù)據(jù)看成一個(gè)整體

一個(gè)數(shù)組是需要n-1趟排序的,總是用后一位跟已排序的數(shù)據(jù)比較(第一趟:第二位跟已排序的數(shù)據(jù)比,第二趟:第三位跟已排序的數(shù)據(jù)比)

用第三位和已排序的數(shù)據(jù)比,實(shí)際上就是讓第三位數(shù)跟兩個(gè)數(shù)比較,只不過這兩個(gè)數(shù)是已經(jīng)排好序的而已。而正是因?yàn)樗藕眯虻模覀兛梢?strong>使用一個(gè)循環(huán)就可以將我們比較的數(shù)據(jù)插入進(jìn)去


    //臨時(shí)變量
    int temp;

    //外層循環(huán)控制需要排序的趟數(shù)(從1開始因?yàn)閷⒌?位看成了有序數(shù)據(jù))
    for (int i = 1; i < arrays.length; i++) {

        temp = arrays[i];

        //如果前一位(已排序的數(shù)據(jù))比當(dāng)前數(shù)據(jù)要大,那么就進(jìn)入循環(huán)比較[參考第二趟排序]
        while (arrays[i - 1] > temp) {

            //往后退一個(gè)位置,讓當(dāng)前數(shù)據(jù)與之前前位進(jìn)行比較
            arrays[i] = arrays[i - 1];

            //不斷往前,直到退出循環(huán)
            i--;

        }

        //退出了循環(huán)說明找到了合適的位置了,將當(dāng)前數(shù)據(jù)插入合適的位置中
        arrays[i] = temp;

    }

上面的代碼還缺少了一個(gè)條件:如果當(dāng)前比較的數(shù)據(jù)比已排序的數(shù)據(jù)都要小,那么while中的arrays[i - 1]會(huì)比0還要小,這會(huì)報(bào)錯(cuò)的。

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
    at Main.main(Main.java:61)

我們應(yīng)該加上一個(gè)條件:i>=1時(shí)才可以,如果i=1了下次再進(jìn)去的時(shí)候就退出循環(huán),讓當(dāng)前數(shù)據(jù)插入到[0]的位置上

復(fù)用i變量的話會(huì)導(dǎo)致多幾次無謂的比較的,所以我們使用另一個(gè)變量j。完整的代碼是這樣的:


    public static void sort(int[] arrays) {
        

        //臨時(shí)變量
        int temp;


        //外層循環(huán)控制需要排序的趟數(shù)(從1開始因?yàn)閷⒌?位看成了有序數(shù)據(jù))
        for (int i = 1; i < arrays.length; i++) {

            temp = arrays[i];

            //如果前一位(已排序的數(shù)據(jù))比當(dāng)前數(shù)據(jù)要大,那么就進(jìn)入循環(huán)比較[參考第二趟排序]

            int j = i - 1;

            while (j >= 0 && arrays[j] > temp) {

                //往后退一個(gè)位置,讓當(dāng)前數(shù)據(jù)與之前前位進(jìn)行比較
                arrays[j + 1] = arrays[j];

                //不斷往前,直到退出循環(huán)
                j--;

            }
            //退出了循環(huán)說明找到了合適的位置了,將當(dāng)前數(shù)據(jù)插入合適的位置中
            arrays[j + 1] = temp;

        }
        System.out.println("公眾號(hào)Java3y" + arrays);
    }
四、插入排序優(yōu)化
二分查找插入排序的原理:是直接插入排序的一個(gè)變種,區(qū)別是:在有序區(qū)中查找新元素插入位置時(shí),為了減少元素比較次數(shù)提高效率,采用二分查找算法進(jìn)行插入位置的確定。

參考資料:http://www.cnblogs.com/heyuquan/p/insert-sort.html

五、擴(kuò)展閱讀

C語言實(shí)現(xiàn)第一種方式:

   
        void InsertSortArray ( int arr[], int n)
        {

            //int arr[]={2,99,3,1,22,88,7,77,54};
            for (int i = 1; i < n; i++)// 循環(huán)從第二個(gè)數(shù)組元素開始
            {
                int temp = arr[i];//temp標(biāo)記為未排序的第一個(gè)元素
                while (i >= 0 && arr[i - 1] > temp) //將temp與已排序元素從大到小比較,尋找temp應(yīng)插入的元素
                {
                    arr[i] = arr[i - 1];
                    i--;
                }
                arr[i] = temp;
            }

        }

C語言實(shí)現(xiàn)第二種方式:

        void insert ( int arr[], int n)
        {
            int key = arr[n];
            int i = n;
            while (arr[i - 1] > key) {
                arr[i] = arr[i - 1];
                i--;
                if (i == 0)
                    break;
            }
            arr[i] = key;
        }

        void insertionSort ( int arr[], int n)
        {
            int i;
            for (i = 1; i < n; i++) {
                insert(arr, i);
            }
        }

測(cè)試代碼:

  main()
        {
            int arr[] = {99, 2, 3, 1, 22, 88, 7, 77, 54};
            int i;
            insertionSort(arr, 9);
            for (int i = 0; i < 9; i++)
                cout << arr[i] << endl;
            return 0;
        }

參考資料:

https://www.cnblogs.com/xiaoming0601/p/5862793.html

http://blog.csdn.net/jianyuerensheng/article/details/51254415

如果文章有錯(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://systransis.cn/yun/68878.html

相關(guān)文章

  • 希爾排序這么簡(jiǎn)單

    摘要:這時(shí)就用簡(jiǎn)單插入排序?qū)?shù)列直至已序從直觀上看希爾排序就是把數(shù)列進(jìn)行分組不停使用插入排序,直至從宏觀上看起來有序,最后插入排序起來就容易了無須多次移位或交換。 一、希爾排序介紹 來源百度百科: 希爾排序(Shells Sort)是插入排序的一種又稱縮小增量排序(Diminishing Increment Sort),是直接插入排序算法的一種更高效的改進(jìn)版本。希爾排序是非穩(wěn)定排序算法。該方...

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

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

    maochunguang 評(píng)論0 收藏0
  • 小試牛刀之sort()排序的實(shí)現(xiàn)

    摘要:比較函數(shù)應(yīng)該具有兩個(gè)參數(shù)和,其返回值如下若小于,在排序后的數(shù)組中應(yīng)該出現(xiàn)在之前,則返回一個(gè)小于的值。把這個(gè)安排好,再繼續(xù)之前的冒泡排序。 受大學(xué)室友的鼓動(dòng),我也打算利用公眾平臺(tái)來記錄自己的前端知識(shí)積累,同時(shí)呢,自己總結(jié)的東西,總歸會(huì)有局限性,希望小伙伴能給我指點(diǎn)迷津。知識(shí)就是一張巨大的網(wǎng),作為一名摸不清頭緒的入學(xué)者,唯一能做的事情就是吐好每一根絲,絲擰成線,線再織成網(wǎng)。好啦,開機(jī)儀式o...

    Barrior 評(píng)論0 收藏0
  • js算法入門(1)--簡(jiǎn)單排序

    摘要:插入排序的過程就是將待插元素一個(gè)個(gè)插入初始有序部分的過程。而直接插入排序就是把未排序的序列里的第一位數(shù)與前面的有序數(shù)列進(jìn)行比較,凡是比它大的都向后移動(dòng)一位,直到找到正確的位置進(jìn)行交換。 1.前言 從上大學(xué)開始,算法與數(shù)據(jù)結(jié)構(gòu)這東西我是一直心心念念,奈何又懶又蠢,這么基礎(chǔ)科目一直沒啥成效。但是如鯁在喉,如果再不學(xué)的話可能就成為一塊心病了。所以雖然和現(xiàn)在工作沒啥關(guān)系但還是決定學(xué)一下基礎(chǔ),聊...

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

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

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

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

0條評(píng)論

Forest10

|高級(jí)講師

TA的文章

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