基礎算法——折半插入排序

這是一種對直接插入排序的一種改良,因為直接插入排序的第一步社裆,我們就能夠獲取到一個有序的集合了拙绊,對這個集合我們可以使用折半查找,查找下一個插入的位置泳秀。再說一下折半查找的實現(xiàn)原理标沪,但是折半查找有一個硬傷,要求待查找的集合是有序的嗜傅,所以我們在查找之前就需要先進行排序金句。比如我們要在1-8中找到3的話,使用折半查找

折半查找

代碼實現(xiàn)如下:

    private static int Binary_Search(int num[],int key){
        int startPos = 0;
        int endPos = num.length - 1;
        int middle;
        
        // 當初始位置大于結(jié)束位置吕嘀,就是遍歷完畢的意思
        while (startPos <= endPos) {
            middle = (startPos + endPos)/2;
            if (num[middle] == key) {
                return middle;
            }else if (num[middle] > key) {
                //key可能在左邊违寞,startPos保持不變
                endPos = middle - 1;
            }else {
                //key可能在右邊,endPos保持不變
                startPos = middle + 1;
            }
        }
        return -1;
    }

上面的方法用于在一個有序的數(shù)組中查找元素key的位置偶房,接下來怎么在直接插入排序中加入折半查找呢趁曼?

    private static int[] Insert_Binary_Sort(int[] num){
        int temp;
        //折半查找必備的三個要素
        int low,high,middle;
        for (int i = 1; i < num.length; i++) {
            // 對于排序,我們只需要找出插入的位置就好了
            //這個位置應該滿足|high- low|等于1棕洋,然后把值插入到他們之間
            temp = num[i];//待插入記錄
            //數(shù)組的0為開始位置挡闰,也是數(shù)組已排序的位置
            low = 0;
            //已排序數(shù)組的結(jié)束位置
            high = i-1;
            while (low <= high) {
                middle = (low+high)/2;
                if (num[middle] >temp) {
                    
                    //中間的元素大于待插入值
                    high = middle -1;
                    
                }
                else {
                    //中間的元素小于或等于待插入值
                    low = middle+1;
                }
            }
            for (int j = i-1; j >= high + 1; j--) {
                num[j+1] = num[j];//其余元素后移
            }
            num[high+1] = temp;//插入元素
        }
        return num;
    }

折半插入排序比直接插入排序會快,但實際上它的時間復雜度還是O(n^2),因為折半查找只是減少了待插入對象的比較次數(shù)而已摄悯,如果n較大的話赞季,那么折半插入排序的效率會比直接插入排序增益不少。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奢驯,一起剝皮案震驚了整個濱河市申钩,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘪阁,老刑警劉巖典蜕,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異罗洗,居然都是意外死亡,警方通過查閱死者的電腦和手機钢猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門伙菜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人命迈,你說我怎么就攤上這事贩绕。” “怎么了壶愤?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵淑倾,是天一觀的道長。 經(jīng)常有香客問我征椒,道長娇哆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任勃救,我火速辦了婚禮碍讨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘蒙秒。我一直安慰自己勃黍,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布晕讲。 她就那樣靜靜地躺著覆获,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢省。 梳的紋絲不亂的頭發(fā)上弄息,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音净捅,去河邊找鬼疑枯。 笑死,一個胖子當著我的面吹牛蛔六,可吹牛的內(nèi)容都是我干的荆永。 我是一名探鬼主播废亭,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼具钥!你這毒婦竟也來了豆村?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤骂删,失蹤者是張志新(化名)和其女友劉穎掌动,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宁玫,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡粗恢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欧瘪。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眷射。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖佛掖,靈堂內(nèi)的尸體忽然破棺而出妖碉,到底是詐尸還是另有隱情,我是刑警寧澤芥被,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布欧宜,位于F島的核電站,受9級特大地震影響拴魄,放射性物質(zhì)發(fā)生泄漏冗茸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一匹中、第九天 我趴在偏房一處隱蔽的房頂上張望蚀狰。 院中可真熱鬧,春花似錦职员、人聲如沸麻蹋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扮授。三九已至,卻和暖如春专肪,著一層夾襖步出監(jiān)牢的瞬間刹勃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工嚎尤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留荔仁,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像乏梁,于是被迫代替她去往敵國和親次洼。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 查找和排序都是程序設計中經(jīng)常用到的算法遇骑。查找相對而言較為簡單卖毁,不外乎順序查找、二分查找落萎、哈希表查找和二叉排序樹查找...
    eagleRock閱讀 5,563評論 0 14
  • 總結(jié)一下常見的排序算法亥啦。 排序分內(nèi)排序和外排序。內(nèi)排序:指在排序期間數(shù)據(jù)對象全部存放在內(nèi)存的排序练链。外排序:指在排序...
    jiangliang閱讀 1,326評論 0 1
  • 概述:排序有內(nèi)部排序和外部排序翔脱,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大媒鼓,一次不能容納全部...
    每天刷兩次牙閱讀 3,727評論 0 15
  • 概述 排序有內(nèi)部排序和外部排序碍侦,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大隶糕,一次不能容納全部...
    蟻前閱讀 5,167評論 0 52
  • 【穎·志】五點起床,回春瑜伽第7天站玄,然后出去行禪枚驻。今天的行禪比以往多了些覺知,懂得了全觀株旷。眼睛可以觀照到身邊的一切...
    Helen_Xia閱讀 503評論 0 52