吃完午飯回來洗完這篇去睡覺,心累~~~(>_<)~~~
其實插入排序的核心思想就是從第一個數依次排序,在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();
}