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

作者: 编码的哲哲 | 来源:发表于2016-10-18 13:21 被阅读144次

吃完午饭回来洗完这篇去睡觉,心累~~~(>_<)~~~
其实插入排序的核心思想就是从第一个数依次排序,在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();

}

相关文章

  • Chapter 2 Foundation of Algorith

    Chapter 2 插入排序 线性查找 选择算法 归并排序算法 二分查找算法 冒泡排序 插入排序 循环不...

  • 基本算法

    冒泡算法 选择排序 插入排序 顺序查找 二分查找

  • 基础排序算法

    快速排序 二分查找 冒泡排序 归并算法 选择排序 插入排序 Shell排序

  • 九种排序算法(重要!!)

    分类:(九种排序算法) 1、插入排序:直接插入排序、二分插入排序、希尔排序; 2、选择排序:简单选择排序、堆排序 ...

  • 二分插入排序

    1.算法思想 二分插入排序也是插入排序算法的一种,其基本思想是:引入二分查找的思想,在直接插入排序的基础上减少比较...

  • 基础算法(查找 , 排序)

    算法分析 渐进符号 - (O , Ω , θ) 查找算法 二分查找 - O(logn) 排序算法 直接插入排序 -...

  • 干货分享:白话12种排序算法

    常见的排序算法: 快速排序、堆排序、归并排序、选择排序 插入排序、二分插入排序 冒泡排序、鸡尾酒排序 桶排序、计数...

  • 七种常见的数组排序算法整理(C语言版本)

    ~~~C语言版本~~~ 冒泡排序 选择排序 直接插入排序 二分插入排序 希尔排序 快速排序 堆排序 排序算法是否稳...

  • 数据结构与算法(七),排序

    这节总结一下常见的排序算法。 目录: 1、插入排序 1.1、直接插入排序 1.2、二分插入排序 2、选择排序 3、...

  • 算法-插入排序

    算 法:插入排序算法时间复杂度: 插入排序算法描述 插入排序伪代码 插入排序实现 插入排序算法概述 插入排...

网友评论

    本文标题:10大排序算法之【二分插入排序】

    本文链接:https://www.haomeiwen.com/subject/aiftuttx.html