数据结构-插入排序(直接插入排序+折半插入排序)

二、插入排序

1.直接插入排序

这里写图片描述

这里我们注意,元素的选择是从第二个元素开始!动态过程如下:

这里写图片描述

递增的代码实现

#include<iostream>
using namespace std;
void insertsort(int a[],int len)
{
    //从第二个元素开始比较
    for(int i=1; i<len; i++)
    {
        //设置一个哨兵,赋值为待插入元素
        int soldier = a[i];
        //从待插入元素开始向前遍历
        for(int j=i-1; j>=0; j--)
        {
            //若大于前一个元素,则在前一个元素后面赋值
            if(soldier>=a[j])
            {
                a[j+1] = soldier;
                break;
            }
            //若小于前一个元素,则继续向前走,前一个元素后移
            else
            {
                a[j+1] = a[j];
                //若比第一个元素还小,则放在第一个位置上
                if(j==0)
                {
                    a[j] = soldier;
                }
            }
        }
    }
    cout<<"排序后为:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
}
int main()
{
    int a[] = {2,4,3,5,1,6};
    int len = sizeof(a)/sizeof(int);
    cout<<"数组的元素为:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
    insertsort(a,len);
    return 0;
}

这里写图片描述

算法分析:
优点:简单,稳定

总比较次数
最好:n-1(有序)
最坏:(n+2)(n-1)/2(逆序有序)

总移动次数
最好:0
最坏:(n+4)(n-1)/2

时间复杂度
最好 O(n)
最坏 O(n^2)
平均 O(n^2)

空间复杂度 O(1)

稳定的排序算法。

因为每次比较时,前面的序列均是有序的,我们在查找时可以采用不同的查找方案,不一定要用顺序查找,如果我们用二分查找,则我们的排序即为:

折半插入排序:(直接附代码)

#include<iostream>
using namespace std;
void Binsertsort(int a[],int len)
{
    for(int i=1; i<len; i++)
    {
        int soldier = a[i];
        int low = 0;
        int high = i-1;
        //找到位置
        while(low<=high)
        {
            int mid = (low + high)/2;
            if(soldier<a[mid])
            {
                high = mid -1;
            }
            else
            {
                low = mid + 1;
            }
        }
        //插入
        for(int j=i-1; j>=high+1; --j)
        {
            a[j+1] = a[j];
        }
        a[high+1] = soldier;
    }
    cout<<"排序后为:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
}
int main()
{
    int a[] = {2,4,3,5,1,6};
    int len = sizeof(a)/sizeof(int);
    cout<<"数组的元素为:"<<endl;
    for(int k=0; k<len; k++)
    {
        if(k==0)
        {
            cout<<a[k];
        }
        else
        {
            cout<<" "<<a[k];
        }
    }
    cout<<endl;
    Binsertsort(a,len);
    return 0;
}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值