数据结构 -- 插入排序(直接插入排序和希尔排序)

插入排序

算法思想

每次将⼀个待排序的记录按其关键字大小插入到前面已排好序的子序列中,直到全部记录插入完成。

代码实现
c 复制代码
void InsertSort(int A[],int n){
    int i,j,temp;
    for(i = 1;i<n;i++){
        if(A[i]<A[i-1]){
            temp = A[i];			//用temp暂存A[i]
            for(j=i-1;j>=0&&A[j]>temp;--j)		//检查所有前面已经排好序的元素
                A[j+1]=A[j];				//所有大于temp的元素都往后挪一位
            A[j+1]=temp;					//复制到插入位置
        }
    }
}
代码实现(带哨兵)
c 复制代码
void Insert(A[],int n){
    int i,j;
    for(i = 2;i<=n;i++){
        if(A[i]<A[i-1]){
            A[0]=A[i];
            for(j=i-1;A[0]<A[j];--j)
                A[j+1]=A[j];
            A[j+1] = A[0];
        }
    }
}

优点:不需要每轮循环都判断一次j>=0

算法效率分析
时间复杂度 空间复杂度 稳定性
O(1) 主要来自对比关键字、移动 元素(若有n个元素 则需要 n-1 趟处理) 稳定
最好情况:每次只需要对比一次 不需要移动→O(n)
最坏情况:原本都是逆序排放的 → O(n2)
平均时间复杂度:O(n2)
优化 -- 折半插入排序

先用折半查找找到应该插入的位置,再移动元素

当low>high时折半查找停止,并将low之后的元素全部右移,并将A[0]复制到low所在位置

为了保证算法的稳定性,当A[mid]=A[0]时,应继续在mid所指的右边寻找插入位置

c 复制代码
void InsertSOrt(int A[],int n){
    iint i,j,low,high,mid;
    for(i=2;i<=n;i++){
        A[0]=A[i];
        low = 1;high = i-1;
        while(low<=high){
            mid = (low+high)/2;
            if(A[mid]>A[0]) 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];
    }
}

比起"直接插入排序",比较关键字的次数减少了,但是移动元素的次数没变,整体来看时间复杂度仍未O(n2)

希尔排序

算法思想

先将待排序表分割成若干形如 L[i, i + d, i + 2d,..., i + kd] 的"特殊"子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d=1为止。

......

c 复制代码
//希尔排序
void ShellSort(int A[],int n){
    int d,i,j;
    //A[0]只是暂存单元,不是哨兵,当j<=0时,插入位置已到
    for(i=d/2;d>=1;d=d/2)
        for(i=d+1;i<=n;++i)
            if(A[i]<A[i-d]){
                A[0]=A[i];
                for(j = i-d;j>0&&)
            }
}

目前无法用数学⼿段证明确切的时间复杂度 ,最坏时间复杂度为 O(n2),当n在某个范围内时,可达O(n1.3)

稳定性:不稳定

适⽤性:仅适⽤于顺序表,不适⽤于链表

相关推荐
执着2592 分钟前
力扣hot100 - 144、二叉树的前序遍历
数据结构·算法·leetcode
范纹杉想快点毕业6 分钟前
嵌入式系统架构之道:告别“意大利面条”,拥抱状态机与事件驱动
java·开发语言·c++·嵌入式硬件·算法·架构·mfc
近津薪荼10 分钟前
递归专题(4)——两两交换链表中的节点
数据结构·c++·学习·算法·链表
2501_9403152611 分钟前
【无标题】2390:从字符串中移除*
java·开发语言·算法
半聋半瞎14 分钟前
Flowable快速入门(Spring Boot整合版)
java·spring boot·后端·flowable
散峰而望23 分钟前
【算法竞赛】树
java·数据结构·c++·算法·leetcode·贪心算法·推荐算法
鱼很腾apoc26 分钟前
【实战篇】 第14期 算法竞赛_数据结构超详解(下)
c语言·开发语言·数据结构·学习·算法·青少年编程
毕设源码-邱学长30 分钟前
【开题答辩全过程】以 基于SpringBoot的理工学院学术档案管理系统为例,包含答辩的问题和答案
java·spring boot·后端
shejizuopin34 分钟前
基于SSM的高校旧书交易系统的设计与实现(毕业论文)
java·mysql·毕业设计·论文·ssm·毕业论文·高校旧书交易系统的设计与实现
修己xj39 分钟前
SpringBoot解析.mdb文件实战指南
java·spring boot·后端