10大排序算法之【二分插入排序】

吃完午飯回來洗完這篇去睡覺,心累~~~(>_<)~~~
其實插入排序的核心思想就是從第一個數依次排序,在0~i-1個有序數列中查找到第i個數的位置,然后將其插入即可。這樣,在查找這個位置時有很多種方法,可以利用前面最暴力的直接插入排序,也可以用接下來要寫的二分插入排序,或者快排,堆排等等,按照實際情況或者項目需求隨意組合即可。用二分排序在代碼實現上有以下一個關鍵點:
不管left和right指針如何變化,這兩貨最終會指向同一個數字,這樣的話要是要排序的list[i]>thisDigit,則left+1的位置即是要插入的位置,反之,若list[i]<thisDigit,則left的位置即是要插入的位置,等于的情況兩者均可,隨便寫。。。只要理解了這點,對于所有二分插入排序算法的編寫都不會困惑,例如什么給定數組不是偶數【相除有余】等等情況均可忽略。。。下面貼出代碼:

include<iostream>

include<vector>

using namespace std;

class BinaryInsertSort{

private:
    int len;
    vector<int> list;
public:
    BinaryInsertSort(vector<int> _list, int _len);      
    void binary_insert_sort();      
    void out();

}; //end class

BinaryInsertSort::BinaryInsertSort(vector<int> _list, int _len){

        for(int i=0; i<_len; i++) list.push_back(_list[i]);
        this->len = _len;   

}

void BinaryInsertSort::binary_insert_sort(){

        int middle;   //中間的那個數
        int left;    //左指針 
        int right;   //右指針 
        for(int i=0; i<len; i++){
            
            left   = 0;
            right  = i-1;
            middle = list[i];
             
            while(left <= right){
                
                if( list[(left+right)/2] > middle) right = (left+right)/2 - 1;
                
                else left = (left+right)/2 + 1; 
            }  //end while
            
            for(int j=i; j>left; j--)list[j] = list[j-1];
            
            list[left] = middle;
            
        } //end for 

}

void BinaryInsertSort::out(){

for(int i=0; i<len;i++) cout<<list[i];  

}

int main(){

int array[9] = {9,8,7,6,5,4,3,2,1};
vector<int> list;
for(int i=0; i<9; i++) list.push_back(array[i]);
BinaryInsertSort mazhe(list,9);
mazhe.binary_insert_sort();
mazhe.out();

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,765評論 18 399
  • 背景 一年多以前我在知乎上答了有關LeetCode的問題, 分享了一些自己做題目的經驗。 張土汪:刷leetcod...
    土汪閱讀 12,769評論 0 33
  • 1.簡介插入排序(Insertion Sort)的算法描述是一種簡單直觀的排序算法。它的工作原理是通過構建有序序列...
    AngerCow閱讀 388評論 0 1
  • 總結一下常見的排序算法。 排序分內排序和外排序。內排序:指在排序期間數據對象全部存放在內存的排序。外排序:指在排序...
    jiangliang閱讀 1,375評論 0 1
  • Easy, bit manipulation 給定整數序列,其中除了一個數其他數都出現兩次,找出該單數。復雜度O(...
    穿越那片海閱讀 332評論 0 0