插入排序和希尔排序


        插入排序包含直接插入排序、折半插入排序、希尔排序

数据结构插入排序的实现

        数据结构中的插入排序主要包括直接插入排序、折半插入排序、希尔排序等等,其基本思想是每次将一个待排序的记录按关键字大小插入到前面已排好序的子序列中,直到全部记录都插入完成,因此空间复杂度都是O(1),而时间复杂度各有不同。

1. 直接插入排序

        直接插入排序是一种稳定排序,平均时间复杂度:O(n²),空间复杂度:O(1),基本思想:在一个数组中,将后面无序的关键字插入到前面已经有序的子序列中,注:A[]数组从1开始存放关键字,A[0]用于存放交换的关键字

#include <iostream>

using namespace std;
typedef int ElemType;

void InsertSort(ElemType A[], int n) {
    int i, j;
    for (i = 2; i <= n; i++) {      //对整个数组进行遍历,直到全部有序
        if (A[i] < A[i - 1]) {    //如果出现无序的关键字
            A[0] = A[i];        //把该关键字保存到第一个数组A[0]
            for (j = i - 1; A[j] > A[0]; j--)   //从这一步开始把比所有A[0]大的关键字往后移
                A[j + 1] = A[j];
            A[j + 1] = A[0];    //把该关键字放入有序的位置
        }
    }
}

2. 折半(二分)插入排序

        折半插入排序是一种稳定排序,平均时间复杂度:O(n²),空间复杂度:O(1),基本思想:将查找和移动操作分开,在已经排好序的子序列中用折半查找找出元素的插入位置,然后统一移动插入位置之后的所有元素,给要插入的元素留出一个空位

void InsertHalfSort(ElemType A[], int n) {
    int i, j, low, high, mid;
    for (i = 2; i <= n; i++) {      //对整个数组进行遍历,直到全部有序,依次将A[2]到A[n]插入前面已经排序的序列
        low = 1, high = i - 1;
        A[0] = A[i];        //把该关键字保存到第一个数组A[0]
        while (low <= high) {
            mid = (low + high) / 2;
            if (A[0] < mid)
                high = mid - 1;
            else
                low = mid + 1;
        }
        for (j = i - 1; j >= high + 1; j--)      //统一移动
            A[j + 1] = A[j];
        A[high + 1] = A[0];
    }
}

3. 希尔排序(缩小增量排序)

        希尔排序(缩小增量排序),是一种不稳定的排序算法,把序列分成相隔距离为d的子序列,把这些相隔距离的关键字组成一个子表,然后对其进行直接插入排序,最差时间复杂度为O(n²),最好时间复杂度为O(n(1.3)),空间复杂度为O(1)

void ShellSort(ElemType A[], int n) {
    int dk, i, j;
    for (dk = n / 2; dk >= 1; dk=dk/2) {       //步长变化
        for (i = dk + 1; i <= n; i++) {     //逐个对该步长下后面的关键字检测
            if (A[i] < A[i - dk]) {         //若发现有无序的关键字
                A[0] = A[i];
                //则按当前步长的距离开始移动其后的元素,腾出位置给该关键字
                for (j = i - dk; j > 0 && A[0] < A[j]; j -= dk)
                    A[j + dk] = A[j];
                A[j + dk] = A[0];
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

素履、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值