排序算法之折半插入排序

news2024/9/21 14:43:33

title: 折半插入排序
date: 2024-7-19 10:17:24 +0800
categories:

  • 排序算法
    tags:
  • 排序
  • 算法
  • 折半插入排序
    description: 折半插入排序(Binary Insertion Sort)是插入排序的一种改进版本。它在插入每个元素时使用二分查找(Binary Search)来找到插入位置,从而减少比较次数。
    math: true

折半插入排序

折半插入排序(Binary Insertion Sort)是插入排序的一种改进版本。它在插入每个元素时使用二分查找(Binary Search)来找到插入位置,从而减少比较次数。

工作原理

设数组为a[0…n]。

  1. 将原序列分成有序区和无序区。a[0…i-1]为有序区,a[i…n] 为无序区。(i从1开始)
  2. 从无序区中取出第一个元素,即a[i],使用二分查找算法在有序区中查找要插入的位置索引j。
  3. 将a[j]到a[i-1]的元素后移,并将a[i]赋值给a[j]。
  4. 重复步骤2~3,直到无序区元素为0。

算法步骤

示例

假设有一个待排序的列表:[12, 11, 13, 5, 6]

第一步

  • 第一个元素 12 已经排序。

第二步

  • 取出 11,使用二分查找找到插入位置(在 12 之前)。
  • 移动元素,将 11 插入到正确位置。
    [11, 12, 13, 5, 6]

第三步

  • 取出 13,使用二分查找找到插入位置(在 12 之后)。
  • 不需要移动元素,直接插入 13。

[11, 12, 13, 5, 6]

第四步

  • 取出 5,使用二分查找找到插入位置(在 11 之前)。
  • 移动元素,将 5 插入到正确位置。

[5, 11, 12, 13, 6]

第五步

  • 取出 6,使用二分查找找到插入位置(在 5 之后)。
  • 移动元素,将 6 插入到正确位置。

[5, 6, 11, 12, 13]

复杂度分析

折半插入排序通过减少比较次数来提高效率,但在元素移动次数上与普通插入排序一致。

时间复杂度

  • 最坏情况时间复杂度 O ( n 2 ) O(n^2) O(n2) (主要由于元素移动次数)
  • 平均情况时间复杂度 O ( n 2 ) O(n^2) O(n2)
  • 最好情况时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)(比较次数)

空间复杂度

  • 空间复杂度 O ( 1 ) O(1) O(1)

代码实现

以下是折半插入排序的Java实现代码:

public class BinaryInsertionSort {
    public static void binaryInsertionSort(int[] arr) {
        int n = arr.length;
        
        // 从数组的第二个元素开始遍历
        for (int i = 1; i < n; i++) {
            int key = arr[i]; // 需要插入的元素
            int left = 0; // 二分查找的左边界
            int right = i; // 二分查找的右边界

            // 使用二分查找找到插入位置
            while (left < right) {
                int mid = (left + right) / 2;
                if (arr[mid] <= key) {
                    left = mid + 1; // 在右半部分查找
                } else {
                    right = mid; // 在左半部分查找
                }
            }

            // 将大于key的元素向后移动一位
            for (int j = i; j > left; j--) {
                arr[j] = arr[j - 1];
            }
            arr[left] = key; // 将key插入到正确的位置
        }
    }

    public static void main(String[] args) {
        int[] arr = {12, 11, 13, 5, 6};
        binaryInsertionSort(arr);
        for (int i : arr) {
            System.out.print(i + " ");
        }
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2034756.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文读懂第三代半导体

一、氮化嫁&#xff08;GaN&#xff09;定义 氮化镓材料定义&#xff1a;氮化镓(GaN)主要是由人工合成的一种半导体材料&#xff0c;禁带宽度大于2.3eV&#xff0c;也称为宽禁带半导体材料。 氮化镓材料为第三代半导体材料的典型代表&#xff0c;是研制微电子器件、光电子器件…

AI技术在招聘数据分析洞察中的作用

一、引言&#xff1a;AI赋能招聘新纪元 在数字化转型浪潮中&#xff0c;人工智能技术&#xff08;AI&#xff09;正以前所未有的速度渗透至各行各业&#xff0c;其中&#xff0c;招聘领域正经历着一场深刻的变革。传统招聘模式依赖于人工筛选简历、面试评估等低效且主观性强的…

【源码+论文】基于VUE的新闻类网站

系统包含&#xff1a;源码论文 所用技术&#xff1a;SpringBootVueSSMMybatisMysql 获取资料请私聊我 1 概述 1.1课题背景及意义 随着现代网络技术发展&#xff0c;对于新闻类网站的设计现在正处于发展的阶段&#xff0c;所以对的要求也是比较严格的&#xff0c;要从系统的…

c++编程(20)——类与对象(6)继承

欢迎来到博主的专栏——c编程 博主ID&#xff1a;代码小豪 文章目录 继承继承与权限访问 基类和派生类基类和派生类的赋值兼容转换基类与派生类的类作用域派生类与基类的构造函数基类与派生类拷贝构造函数 继承与静态成员final关键字 面向对象编程的核心思想是封装、继承和多态…

LeetCode - 209 - 长度最小的子数组

力扣209题 题目描述&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&…

unordered_map与unordered_set的实现

目录 1.底层结构 1&#xff09;方式 2&#xff09;哈希冲突 3&#xff09;哈希函数 4&#xff09;哈希冲突的解决 1.闭散列 1&#xff09;线性探测 扩容&#xff1a; 2&#xff09;二次探测 2.开散列 1&#xff09;概念 2&#xff09;实现 插入操作&#xff1a; 删…

8个不可错过的高清视频素材网

寻找优质高清视频素材是许多创意工作者和内容创作者必不可少的一项任务。无论是在制作广告、影视作品&#xff0c;还是在进行视频编辑和设计工作&#xff0c;高质量的视频素材都能为你的作品增色不少。 推荐8个备受好评的高清视频素材网站&#xff0c;这些网站提供丰富多样、高…

Django基础知识

文章目录 新建Django项目helloworld关联数据库admin 新建Django项目 创建django-admin startproject project_name 运行 python manage.py runserver 创建app: python manage.py startapp app_name 目录&#xff1a; 配置文件 settings.py 路由配置 urls.py 项目管理 manage.p…

facebook广告效果下降,可能是进入了疲劳期

在做facebook广告的时候&#xff0c;你是否遇到过原本效果很好的广告&#xff0c;突然开始走下坡路的情况&#xff0c;这可能是因为广告进入了疲劳期&#xff0c;广告疲劳期指的是广告展现频率过高&#xff0c;用户多次看到相同广告后就对此感到了厌倦&#xff0c;所以会出现广…

IMA自动接触系统ACS操作手测

IMA自动接触系统ACS操作手测

飞轮科技首席执行官马如悦受邀出席可信数据库发展大会,三大事件,一文解读!

近日&#xff0c;由中国通信标准化协会、大数据技术标准推进委员会主办&#xff0c;InfoQ 极客传媒联合主办的 “2024 可信数据库发展大会” 在京成功召开。此次大会汇聚了众多数据库行业领军企业、专家学者&#xff0c;共同探讨全球数据库发展趋势&#xff0c;分享最具权威性的…

合成数据的pipline

参考&#xff1a;https://github.com/yizhongw/self-instruct 总体来说就是 大模型自己遵循一套流程来生成数据&#xff0c;然后来微调自己。 1.指令生成 每一个迭代都选8个任务的指令作为该任务的提示样本&#xff0c;其中6个是人写的&#xff0c;2个是生成的。 然后组成输…

从零到一:家政保洁小程序搭建全攻略与功能作用深度解析

目录 一、家政保洁小程序主要功能 二、家政保洁小程序搭建教程 &#xff08;一&#xff09;前期准备 &#xff08;二&#xff09;注册与选择工具 &#xff08;三&#xff09;设计与开发 &#xff08;四&#xff09;测试与优化 &#xff08;五&#xff09;发布与推广 一、…

笔记本CPU天梯图(2024年8月),含AMD/骁龙等新CPU

原文地址&#xff08;高清无水印原图/持续更新/含榜单出处链接&#xff09;&#xff1a; 2024年8月笔记本CPU天梯图 2024年8月笔记本CPU天梯图 2024年8月5日更新日志&#xff1a;常规更新Cinebench R23、PassMark笔记本CPU天梯图&#xff0c;新增Geekbench 6.2单核多核天梯图&…

您真的了解人类反馈强化学习(RLHF)吗?

生成性人工智能&#xff0c;就像ChatGPT和Gemini这样的应用&#xff0c;现在可火了&#xff0c;感觉我们生活中越来越离不开它们。 不过呢&#xff0c;这些工具虽然厉害&#xff0c;但用的时候也得留个心眼&#xff0c;因为它们可能会搞出些问题来。比如&#xff0c;有时候AI可…

DP转Type-c方案 带PD快充(外接显卡与VR)

DP转Type-C技术允许用户将DisplayPort信号转换为Type-C接口&#xff0c;‌以便连接和支持Type-C接口的设备。‌ DP转Type-C技术主要应用于需要将DisplayPort信号转换为Type-C接口的情况&#xff0c;‌以便连接和支持只有Type-C接口的设备。‌这种转换技术通过专门的转换器或连…

前端项目中的Server-sent Events(SSE)项目实践及其与websocket的区别

前端项目中的Server-sent Events(SSE)项目实践 前言 在前端开发中&#xff0c;实时数据更新是提升用户体验的重要因素之一。Server-SentEvents(SSE)是一种高效的技术&#xff0c;允许服务器通过单向连接将实时数据推送到客户端。下面将从SSE的基本改变&#xff0c;使用场景展…

TCP问题总结

TCP三次握手与四次挥手 1.TCP 头格式有哪些&#xff1f; 标注颜⾊的表示与本⽂关联⽐较⼤的字段&#xff0c;其他字段不做详细阐述。 序列号&#xff1a;在建⽴连接时由计算机⽣成的随机数作为其初始值&#xff0c;通过 SYN 包传给接收端主机&#xff0c;每发送⼀次数 据&am…

MapReduce入门教程

这可不是目录 入门定义与说明数据分析Map和Reduce阶段的任务<Kn,Vn>分析MapReduce的数据类型其他说明(持续更新) 开发案例(持续更新)自定义的wordcountcsv文件操作序列化操作 入门 定义与说明 数据分析 以下未数据分析示意图 Map和Reduce阶段的任务 Map阶段的任务&a…

安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究

摘要&#xff1a;传统电力系统的结构和运行模式在以新能源为主体的新型电力系统中发生了巨大的变化&#xff0c;分布式储能作为电力系统中重要的能量调节器&#xff0c;也迎来了新的发展机遇。立足于储能技术发展现状&#xff0c;分析了分布式储能技术特点及在清洁可再生能源方…