4.插入排序

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

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

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

指针 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 
#include 
using namespace std;

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

int main()
{
    Sort sortob;
    vector mvec=sortob.init();
    sortob.insert(mvec);
    cout <<"------result-------"<

输出结果:

image.png

你可能感兴趣的:(4.插入排序)