美文网首页
4.插入排序

4.插入排序

作者: 吴金君 | 来源:发表于2018-07-24 15:56 被阅读0次

4.插入排序

4.1插入排序的思想和复杂度

插入排序思想

插入排序每次扫描的元素个数递增一个,且将最小的插入到最前面,然后将其余数字向后移动。直到逐个扫描到最后一个元素。

时间和空间复杂度

时间复杂度如表所示

算法 平均情况 最好情况 最差情况
冒泡 O(N^2) O(N) O(N^2)

空间复杂度:O(1)

4.2插入排序操作

假设有这样一个数组vec:

下标 0 1 2 3 4 5 6 7 8 9
数组 4 3 5 2 1 9 8 6 0 7

插入排序同样以外层循环和内层循环的逻辑来分析,内层循环的目的是找到当前轮次中最小的值,然后将其插入到最前面,其余数字原模原样地向后移动。内层循环遍历的顺序是从右到左。
外层循环的目的是依次递增扫描的窗长,每次都增加扫描一个数。

内层循环(0<j<=i, j--)

i=3的内层循环:

指针 i
更新数组 3 4 5 2 1 9 8 6 0 7
指针 j i
更新数组 3 4 5 2 1 9 8 6 0 7
指针 j i
更新数组 3 4 5 2 1 9 8 6 0 7
指针 j i
更新数组 3 4 5 2 1 9 8 6 0 7
指针 i&j
更新数组 2 3 4 5 1 9 8 6 0 7

外层循环(1<=i<vec.size(), i++)

可以通过下表理解外层循环的交换:

指针 i
原始数组 0 4 3 5 2 1 9 8 6 7
指针 i
原始数组 0 1 4 3 5 2 9 8 6 7
指针 i
原始数组 0 1 2 4 3 5 9 8 6 7
指针 i
原始数组 0 1 2 3 4 5 9 8 6 7
...
指针 i
更新数组 0 1 2 3 4 5 6 7 8 9

OK, 可以上代码了。

4.3 C++代码

#include <iostream>
#include <vector>
using namespace std;

class Sort
{
public:
    void insert(vector<int> &vec)
    {
        int number=vec.size();
        vector<int> nullvec;
        if(number==0)return;
        for(int i=1;i<number;i++)
        {
            for(int j=i;j>0;j--)
            {
                if(vec[j]<vec[j-1])
                {
                    exch(vec,j,j-1);
                }
            }
            show(vec);
        }
    }
    void show(vector<int> &vec)
    {
        for(int i=0;i<vec.size();i++)
        {
            cout << vec[i] << " ";
        }
        cout << endl;
    }
    vector<int> init()
    {
        vector<int> vec;
        int arr[10]={4,3,5,2,1,9,8,6,0,7};
        vec.insert(vec.begin(),arr,arr+10);
        cout <<"ori:"<<endl;
        show(vec);
        cout <<"-------------------"<<endl;
        return vec;
    }
    bool checkorder(vector<int> &vec)
    {
        for(int i=0;i<vec.size()-1;i++)
        {
            if(vec[i]>vec[i+1])return false;
        }
        return true;
    }
private:
    void exch(vector<int> &vec,int a,int b)
    {
        int tmp;
        tmp=vec[a];
        vec[a]=vec[b];
        vec[b]=tmp;
    }
};

int main()
{
    Sort sortob;
    vector<int> mvec=sortob.init();
    sortob.insert(mvec);
    cout <<"------result-------"<<endl;
    if(sortob.checkorder(mvec))
        sortob.show(mvec);
    else
    {   cout << sortob.checkorder(mvec);
    }
    return 0;
}

输出结果:

image.png

相关文章

网友评论

      本文标题:4.插入排序

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