二分法插入排序


直接插入排序和二分法插入排序的區(qū)別。

  • 相同之處:

插入第i個(gè)元素時(shí), 前i-1個(gè)元素已經(jīng)是有序的

  • 不同之處:

直接插入排序在尋找子數(shù)組(前i-1個(gè)元素組成的有序數(shù)組)中的插入位置時(shí),是拿待插入的元素和子數(shù)組里的元素按順序從左到右或從右到左一個(gè)一個(gè)比較來(lái)確定待插入的位置。

二分法插入排序是拿待插入元素和有序子數(shù)組中間位置的元素比較,以當(dāng)前的中間位置為分界點(diǎn)來(lái)確定待插入元素在該分界點(diǎn)的左邊還是右邊, 如果在左邊, 就把分界點(diǎn)左邊的元素序列當(dāng)作下一次的要尋找的子數(shù)組(不包括中間元素)。 如果在右邊, 就把分界點(diǎn)右邊的元素序列當(dāng)作下一次的要尋找的子數(shù)組(不包括中間元素)。重復(fù)上述過(guò)程直到子數(shù)組的長(zhǎng)度小于1查找結(jié)束。


/**
 * 二分法插入排序
 *
 */
public class BinaryInsertSort {

    public void binaryInsertSort(int[] array) {

        for (int i = 1; i < array.length; i++) {
            int temp = array[i];    // 待插入的元素
            int left = 0;           // 已有序序列的起始下標(biāo)
            int right = i - 1;      // 已有序序列的結(jié)束下標(biāo)
            int middle = 0;         // 已有序序列的中間下標(biāo)
            // 利用二分法尋找插入位置
            while (left <= right) { 
                middle = (left + right) / 2;
                if (temp > array[middle]) {
                    left = middle + 1;
                } else {
                    right = middle - 1;
                }
            }
            // 找到了元素的插入位置, 把下標(biāo)從left開(kāi)始往后的所有元素后移一位(包括left位置的元素)
            for(int j = i - 1; j >= left; j--) {
                array[j + 1] = array[j];
            }
            
            // 待插入的元素歸位
            if(i != left) {
                array[left] = temp;
            }
        }
        display(array);
    }

    public void display(int[] array) {
        for(int x: array) {
            System.out.print(x + " ");
        }
    }
    
    public static void main(String[] args) {
        int[] array = {1,3,4,3,8,3,2,6,7,4,9,10,0,-1,-7,4,2,9,7,20};
        BinaryInsertSort insertSort = new BinaryInsertSort();
        insertSort.binaryInsertSort(array);
        //結(jié)果: -7 -1 0 1 2 2 3 3 3 4 4 4 6 7 7 8 9 9 10 20 
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 大寫(xiě)的轉(zhuǎn) 目錄 [冒泡排序][雞尾酒排序] [選擇排序] [插入排序][二分插入排序][希爾排序] [歸并排序] ...
    Solang閱讀 1,868評(píng)論 0 16
  • 概述 因?yàn)榻⊥?,加上?duì)各種排序算法理解不深刻,過(guò)段時(shí)間面對(duì)排序就蒙了。所以決定對(duì)我們常見(jiàn)的這幾種排序算法進(jìn)行統(tǒng)一總...
    清風(fēng)之心閱讀 797評(píng)論 0 1
  • 昨夜,婧婧翻看空間,看到我之前的幾篇日志,有些觸動(dòng)情緒。我倆畢業(yè)后偶有幾句閑聊,遠(yuǎn)去哈佛醫(yī)學(xué)院的她,和成為一名朝陽(yáng)...
    魚(yú)冬眠閱讀 273評(píng)論 0 1
  • 在一周進(jìn)步的公眾號(hào)里看到一篇文章《“我討厭我的專業(yè)?!薄?。這篇文章從常見(jiàn)的人們抱怨自己入錯(cuò)了行開(kāi)始,介紹如何培養(yǎng)自...
    打嗝海貍閱讀 296評(píng)論 0 1
  • 落雁伴暮枝頭鳴 鴛鴦嬉戲湖光中 綠波微蕩輕舟出 青山無(wú)語(yǔ)夕陽(yáng)松
    esir李閱讀 190評(píng)論 0 0

友情鏈接更多精彩內(nèi)容