当前位置: 首页 > article >正文

C语言插入排序及其优化

插入排序算法详解

插入排序是一种简单直观的排序算法。它通过构建有序序列,将未排序部分的元素插入到已排序部分的正确位置,直到所有元素排序完成。下面是插入排序的关键点及其实现细节。


算法思想

  1. 从第二个元素(下标为 1)开始,假定左侧的子数组已排序。
  2. 将当前元素与已排序部分逐一比较,找到插入点。
  3. 将插入点后的元素依次后移,为当前元素腾出位置。
  4. 重复上述过程,直至所有元素排序完成。

直接插入法排序 

void insert_sort(int array[], int size) {
    for (int i = 1; i < size; i++) {
        int temp = array[i]; // 当前待插入的元素
        int j = i - 1;

        // 查找插入位置
        while (j >= 0 && temp < array[j]) {
            array[j + 1] = array[j]; // 元素后移
            j--;
        }
        array[j + 1] = temp; // 插入元素
    }
}

优化方法

插入排序的主要时间消耗来源于:

  1. 查找插入位置的比较操作。
  2. 元素后移的赋值操作。

可以通过以下方法进行优化:

二分插入法排序

#include <stdio.h>

void insert_sort(int array[], int size) {
    for (int i = 1; i < size; i++) {
        int temp = array[i];
        int left = 0, right = i - 1;

        // 二分查找插入位置
        while (left <= right) {
            int mid = (left + right) / 2;
            if (array[mid] > temp)
                right = mid - 1;
            else
                left = mid + 1;
        }

        // 将大于 temp 的元素右移
        for (int j = i - 1; j >= left; j--) {
            array[j + 1] = array[j];
        }
        array[left] = temp; // 插入到正确位置
    }
}

时间复杂度分析

操作最好情况(数组已排序)最坏情况(数组逆序)平均情况
比较次数O(n)O(n)O(n)O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)
移动次数O(n)O(n)O(n)O(n2)O(n^2)O(n2)O(n2)O(n^2)O(n2)

尽管插入排序在最坏情况下的复杂度是 O(n2)O(n^2)O(n2),但在以下情况下表现良好:

  1. 数据接近有序时,比较和移动次数大幅减少。
  2. 数据量较小时,插入排序的简单性使其执行速度不逊于复杂的排序算法。

http://www.kler.cn/a/460219.html

相关文章:

  • 【AI】最近有款毛茸茸AI生成图片圈粉了,博主也尝试使用风格转换生成可爱的小兔子,一起来探索下是如何实现的
  • Docker--Docker Container(容器) 之 操作实例
  • Docker学习相关笔记,持续更新
  • PyTorch 中 reciprocal(取倒数)函数的深入解析:分析底层实现CPP代码
  • 实践:事件循环
  • 聊聊 C# 中的委托
  • 微服务のGeteWay
  • iPhone修复技巧|iPhone异常问题的常用修复方法
  • Excel文件恢复教程:快速找回丢失数据!
  • 位运算与操作符应用
  • Element plus 的 upload 组件实现自定义上传
  • 为什么要用ZGC
  • rocketmq5源码系列--(二)--生产者发送消息
  • Java基础(五): 案例练习;
  • 2024年度AI与科技突破:量子计算引领创新浪潮
  • 实战设计模式之策略模式
  • 操作系统(26)数据一致性控制
  • 计算机网络•自顶向下方法:网络层介绍、路由器的组成
  • 网工日记:FTP两种工作模式的区别
  • dockerfile 安装 Python 依赖,修改为国内的镜像源
  • [react]小技巧, ts如何声明点击事件的类型
  • 快速了解开源日志框架log4net:灵活记录应用程序日志信息的利器
  • 《代码随想录》Day20打卡!
  • 使用亚马逊针对 PyTorch 和 MinIO 的 S3 连接器实现可迭代式数据集
  • 深入探讨 Nginx 性能优化:从基础到高级的最佳实践
  • 活动预告 | Microsoft Power Platform 在线技术公开课:实现业务流程自动化