简单插入排序

目录

🍉 原理介绍:

🍉 特点:

🍉 代码示例:普通插入排序

🍉 算法复杂度:

🍉 改进方案:


🍉 原理介绍:

一分钟掌握“插入排序”_哔哩哔哩_bilibili

它的基本思想是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数据的排序。

🍉 特点:

  1. 稳定:插入排序是一种稳定的排序算法,它能够保证在排序过程中相等元素的相对位置不变。

  2. 最坏情况下比较n*(n-1)/2次,最好情况下比较n-1次;

  3. 第k次排序后,前k个元素已经是排好序的。

🍉 代码示例:普通插入排序

/*****************************************************
 * @description: ordinary insert
 * @author: kashine
 * @version: 1.0
 * @mail: likaiqinchina@gmail.com
 * @date: 2022/12/25
******************************************************/
#include <iostream>
using namespace std;

void insert_sort(int array[], int num)
{
    int key, j;
    // 从第二个元素开始,默认第一个元素有序
    for(int i = 1; i < num; i++)
    {
        key = array[i];
        j = i - 1;
        while(j >= 0 && key < array[j])
        {
            array[j + 1] = array[j];
            j--;
        }
        array[j+ 1] = key;
    }
}

void display(int array[], int num)
{
    for(int i = 0; i < num; i++)
    {
        cout<< array[i]<< " ";
    }
    cout<<endl;
}

int main()
{
    int array[] = {5, 2, 4, 6, 1, 3};
    int num = sizeof(array) / sizeof(array[0]);

    display(array, num);

    insert_sort(array, num);

    display(array, num);
    return 0;
}

🍉 算法复杂度:

最好时间复杂度:O(N) 有序

最坏时间复杂度:O(N2)

平均时间复杂度:O(N2)

🍉 改进方案:

二分(折半)插入排序:二分插入排序是插入排序的另一种改进版本,它通过使用二分查找来确定待插入元素的位置,从而减少比较的次数。

二分插入排序:

/*****************************************************
 * @description: binary insert sort
 * @author: kashine
 * @version: 1.0
 * @mail: likaiqinchina@gmail.com
 * @date: 2022/12/25
******************************************************/
#include <iostream>
using namespace std;

// 折半插入排序
void binary_insert_sort(int array[], int num)
{
    int key;
    int left, right, mid = 0;
    // 从第二个元素开始,默认第一个元素有序
    for(int i = 1; i < num; i++)
    {
        key = array[i];

        left = 0;
        right = i - 1;
        while(left <= right)// 第一次需要等号
        {
            mid = (left + right) / 2;
            if(array[mid] > key)right = mid - 1;// key一定要放在mid的左边
            else left = mid + 1;// key一定要放在mid的右边
            cout<< left<< " "<< right<<endl;
        }
        cout<<endl;

        // left和right最终一定会指向同一个元素,然后再执行一次while后跳出
        // 如果这个元素大于key,right = mid - 1,left指向最后一个大于key的元素
        // 如果这个元素小于key,left = mid + 1,left指向最后一个大于key的元素
        for(int j = i - 1; j >= left; j--)
        {
            array[j + 1] = array[j];// 当前元素左侧比key大的元素往左移,覆盖掉key所在位置   
        }
        array[left] = key;// 将当前待排序元素插入到指定位置
    }
}

void display(int array[], int num)
{
    for(int i = 0; i < num; i++)
    {
        cout<< array[i]<< " ";
    }
    cout<<endl;
}

int main()
{
    int array[] = {5, 2, 4, 6, 1, 3, 20, 35, 16, 164, 28, 46, 69};
    int num = sizeof(array) / sizeof(array[0]);

    display(array, num);

    binary_insert_sort(array, num);

    display(array, num);
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kashine

你的鼓励将是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值