【算法系列 | 2】深入解析排序算法之插入排序

news2024/9/25 3:17:48

序言

你只管努力,其他交给时间,时间会证明一切。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记一级论点
  • 蓝色:用来标记二级论点

决定开一个算法专栏,希望能帮助大家很好的了解算法。主要深入解析每个算法,从概念到示例。

我们一起努力,成为更好的自己!

今天第二讲,讲一下排序算法的插入排序

1 基础介绍

排序算法是很常见的一类问题,主要是将一组数据按照某种规则进行排序。

以下是一些常见的排序算法:

  1. 冒泡排序(Bubble Sort)

  2. 插入排序(Insertion Sort)

  3. 选择排序(Selection Sort)

  4. 归并排序(Merge Sort)

  5. 快速排序(Quick Sort)

  6. 堆排序(Heap Sort)

插入排序

原理介绍

插入排序是一种简单直观的排序算法,其原理是将一个数组分成已排序和未排序两部分初始时已排序部分只有一个元素,然后将未排序部分的每个元素插入到已排序部分的适当位置,直到所有元素都被排序

当将一个元素插入到已排序部分时,需要将已排序部分中所有大于该元素的元素向后移动一位,然后将该元素插入到合适的位置。

例如,假设已排序部分为 [3, 5, 8],待插入元素为 4,需要将 5 和 8 向后移动一位,然后将 4 插入到 5 的位置,最终已排序部分变为 [3, 4, 5, 8]。

这一过程可以使用一个内部循环来实现。从待插入元素的前一个位置开始,向前遍历已排序部分,直到找到第一个小于等于待插入元素的位置,然后将待插入元素插入到该位置之后。

具体实现时,我们可以使用两个嵌套的循环。外层循环遍历未排序部分中的每个元素,内层循环从待插入元素的前一个位置开始,向前遍历已排序部分,直到找到第一个小于等于待插入元素的位置,然后将待插入元素插入到该位置之后。

下面是一个伪代码实现:

for i from 1 to n-1 do
    j = i
    while j > 0 and A[j-1] > A[j] do
        swap A[j] and A[j-1]
        j = j - 1

其中,变量 i 用于遍历未排序部分,变量 j 指向待插入元素在已排序部分中的位置,循环内部的 while 循环用于将待插入元素插入到正确的位置。

复杂度

时间复杂度为 O(n^2),空间复杂度为 O(1)。

使用场景

插入排序的优点是对于小规模的数据集,它的效率比较高,而且它的实现比较简单

但是对于大规模的数据集,插入排序的效率会比较低,因为它需要进行大量的元素移动操作。

代码实现

Python 实现

下面是一个使用 Python 实现快速排序的示例代码:

def quick_sort(arr):
    if len(arr) <= 1:
        return arr
    pivot = arr[0]
    left = []
    right = []
    for i in range(1, len(arr)):
        if arr[i] < pivot:
            left.append(arr[i])
        else:
            right.append(arr[i])
    return quick_sort(left) + [pivot] + quick_sort(right)

思路,

  1. 首先检查数组的长度,如果长度小于等于 1,说明该数组已经有序,直接返回即可。
  2. 否则,选择一个基准元素(这里选择第一个元素作为基准),将数组分成两个部分,小于基准元素的部分和大于等于基准元素的部分。
  3. 然后,递归地对这两个部分进行快速排序,并将它们拼接起来,得到最终的排序结果。

代码实现:

  1. 使用了两个辅助数组 left 和 right,分别用于存储小于基准元素和大于等于基准元素的部分。
  2. 遍历原数组时,如果当前元素小于基准元素,就将它添加到 left 数组中,否则将它添加到 right 数组中。
  3. 最后,递归地对 left 和 right 数组进行排序,并将它们和基准元素拼接起来,得到最终的排序结果。

Java实现

下面是一个使用 Java 实现快速排序的示例代码:

public static void quickSort(int[] arr, int left, int right) {
    if (left >= right) {
        return;
    }
    int pivot = arr[left];
    int i = left + 1, j = right;
    while (i <= j) {
        if (arr[i] < pivot) {
            i++;
        } else if (arr[j] >= pivot) {
            j--;
        } else {
            swap(arr, i, j);
            i++;
            j--;
        }
    }
    swap(arr, left, j);
    quickSort(arr, left, j - 1);
    quickSort(arr, j + 1, right);
}

private static void swap(int[] arr, int i, int j) {
    int temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

实现思路:

  1. 首先检查左右指针的位置,如果左指针大于等于右指针,说明当前的子数组已经有序,直接返回即可。
  2. 否则,选择一个基准元素(这里选择左端点的元素作为基准),将数组分成两个部分,小于基准元素的部分和大于等于基准元素的部分。
  3. 然后,使用两个指针 i 和 j 分别从左右两端开始遍历,将小于基准元素的元素移动到左边,将大于等于基准元素的元素移动到右边,直到 i 和 j 相遇。
  4. 最后,将基准元素交换到正确的位置上,递归地对左右两个部分进行快速排序。

代码实现:

  1. 使用了两个辅助指针 i 和 j,分别从左右两端开始遍历数组。
  2. 在遍历过程中,如果 arr[i] 小于 pivot,就将 i 向右移动一位;如果 arr[j] 大于等于 pivot,就将 j 向左移动一位;
  3. 否则,交换 arr[i] 和 arr[j],然后将 i 向右移动一位,将 j 向左移动一位。当 i 和 j 相遇时,遍历结束,此时 arr[j] 是小于 pivot 的最后一个元素,将 pivot 交换到 arr[j] 的位置上,然后递归地对左右两个部分进行快速排序。

今天就到这里了,下期见~ 

图书推荐

图书名称:

  • Python程序设计:人工智能案例实践 
  • 机器学习 Python版
  • 深度强化学习

Python程序设计:人工智能案例实践 

图书介绍:

极简入门Python和AI,读这一本就够了!

538个实例帮你掌握交互式IPython解释器和JupyterNotebook并应用Python实践人工智能项目。

作者:[美] 保罗·戴特尔,[Paul,J.Deitel],[美] 哈维·戴特尔(Harvey 

译者:王恺、王刚、于名飞 等

书号:978711167845

定价:149.00

机器学习 Python版

图书介绍:

机器学习初学者入门指南

使用Python语言以及scikit-learn库,掌握开发机器学习系统所需的流程、模式和策略。

作者:[美] 马克·E.芬纳(Mark E. Fenner) 

译者:江红,余青松,余靖 

书号:9787111706007

定价:149.00

深度强化学习

图书介绍:

谷歌首席科学家力荐!

深度强化学习软件库开发者力作,无门槛深度强化学习实践指南。

作者:[美] 劳拉·格雷泽(Laura Graesser) 等 

译者:许静、过辰楷、金骁、刘磊、朱静雯 等 

书号:9787111689331

定价:119.00

参与方式 

图书数量:本次送出 3 本   !!!⭐️⭐️⭐️
活动时间:截止到 2023-06-09 12:00:00

抽奖方式:

  • 2本,留言+该留言论赞数的前1名!
  • 1本,评论区随机挑选小伙伴!

留言内容:“放弃不难,但坚持一定很酷!+【你想要的书名】”

留言内容:努力过后,才知道许多事情,坚持坚持,就过来了。+【你想要的书名】

或者。文章评论+【你想要的书名】

参与方式:关注博主、点赞、收藏,评论区留言 

中奖名单 

🍓🍓 获奖名单🍓🍓

 中奖名单:请关注博主动态

名单公布时间:2023-06-09 下午
 

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

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

相关文章

看这篇文章能让你健康多活若干年

这个世界值得你多活几十年&#xff0c;即便你对现在的生活不满意&#xff0c;你也会对几十年后的生活倾慕不已。 毕竟&#xff1a; 到2029年&#xff0c;区块链就出来第二十年了&#xff0c;Web3会让我们生活得更容易。 到2042年&#xff0c;chatGPT就出来第二十年了&#xff0…

SpringCloudAlibaba

Spring Cloud Alibaba 是 Spring Cloud 的一个子项目&#xff0c;它是由阿里巴巴开发的一套微服务解决方案&#xff0c;旨在为微服务架构提供一站式解决方案&#xff0c;包括服务注册与发现、配置中心、消息总线、负载均衡、熔断器、限流器、分布式事务等组件。 Spring Cloud A…

阿里、字节大佬共创的Netty核心原理手册,必须是全网No.1

讲到这里&#xff0c;你可能要问了&#xff1a;如果我的工作中涉及网络编程的内容并不多&#xff0c;那我是否还有必要花精力学习 Netty 呢&#xff1f;其实在互联网大厂&#xff08;阿里、腾讯、美团等&#xff09;的中高级 Java 开发面试中&#xff0c;经常会问到涉及到 Nett…

将一个数组分为多个数组按其元素总数尽量均分的numpy.array_split()方法

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 将一个数组s分为多个数组 按s中元素总数尽量均分 numpy.array_split() [太阳]选择题 关于以下代码说法错误的一项是? import numpy as np a np.array([1,2,3,4]) print("【显示】a &quo…

突发!ChatGPT之父警告AI可能灭绝人类,350名AI权威签署联名公开信

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ni7WOmZz-1685770686028)(C:\Users\lenovo\AppData\Local\Temp\ksohtml3116\wps1.jpg)] 就在刚刚&#xff0c;AI 领域传出一封重要的公开信。 包括 「ChatGPT 之父」Sam Altman 在内 350 位 AI 权威都…

【历史上的今天】6 月 5 日:揭幕计算机历史的一次聚会;公钥密码学先驱诞生;函数语言设计先驱出生

整理 | 王启隆 透过「历史上的今天」&#xff0c;从过去看未来&#xff0c;从现在亦可以改变未来。 今天是 2023 年 6 月 5 日&#xff0c;世界环境日。1972 年 6 月 5 日至 16 日&#xff0c;联合国人类环境会议在斯德哥尔摩举行&#xff0c;会上发表了《人类环境言》&#x…

tdesign的白天黑夜模式实现原理

以tdesign为例 我们看下源码 可以看到,tdesign是借助于:root选择器,并结合属性选择器来设置的,当html标签存在一个名叫theme-mode属性的时候,如果值为dark就使用白天的主题,否则就使用黑天的主题 我们切换下颜色,更改html当中的属性,可以看到下图的区别 <!DOCTYPE html&g…

​细说websocket -Node篇​

一、WebSocket 协议 1. 概述 websocket协议允许不受信用的客户端代码在可控的网络环境中控制远程主机。该协议包含一个握手和一个基本消息分帧、分层通过TCP。简单点说&#xff0c;通过握手应答之后&#xff0c;建立安全的信息管道&#xff0c;这种方式明显优于前文所说的基于…

中国汽车品牌出海简直“泰裤辣”!

世界上有五种辣&#xff1a;微辣、中辣、特辣、变态辣&#xff0c;还有一种叫“泰裤辣”&#xff01;随着中国汽车品牌出海的步伐加快&#xff0c;泰国市场成为了一个备受关注的目标。无论是泰国对汽车产业的激励政策&#xff0c;还是泰国当地对促进汽车消费的力度&#xff0c;…

三星不愿成为炮灰,加速抢占美光的市场,美国的愿望落空

在美光被中国实施安全审查后&#xff0c;美国曾要求韩国芯片不要趁机扩大销售&#xff0c;抢占美光留下的市场人&#xff0c;然而由于全球芯片行业的衰退&#xff0c;三星等韩国企业担忧成为炮灰而加速抢占美光的市场。 一、韩国芯片不好过 三星等韩国芯片企业如此做&#xff0…

yolov5s融合ECA、CA、Transformer等组件开发构建海洋场景下远红外目标检测模型,并进行实验对比分析

海洋海面远红外场景下的目标检测在我之前的文章中已经有过相关的实践了&#xff0c;感兴趣的话可以自行移步阅读即可。 《红外海洋目标检测实践&#xff0c;基于目标检测模型识别红外海洋目标》 《基于YOLO开发构建红外场景下无人机航拍车辆实例分割检测识别分析系统》 《红…

CAD软件外包开发的技术难点

CAD软件的开发具有一定的复杂性和挑战性&#xff0c;需要复杂的数学和几何计算&#xff0c;同时需要兼顾高性能&#xff0c;这对软件开发者有比较高的要求。今天和大家分享这方面的知识&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发…

Centos升级docker后启动容器报错“unknown or invalid runtime name”

前言 操作系统为centosdocker原来的版本为1.31.1&#xff0c;升级后为20结尾有升级docker的教程听说图片能凑字数&#xff0c;就截图贴了 插播一个问题记录 加入后面出现无法强制删除镜像文件时&#xff0c;或者报错&#xff08;无法创建容器&#xff09; 按照如下解决 1. 报…

多语言跨境商城源码系统选择定制开发|多语言电商源码

多语言跨境商城源码选择 欢迎名片沟通 多语言跨境商城源码系统应当具有符合自身需求的语言和环境&#xff0c;具体应有&#xff1a;多语言支持、界面设计、支付方式、物流配送、安全性、性能和稳定性、可扩展性等等。具体如下&#xff1a; 多语言支持——具备语言切换…

13.生命周期函数

小程序中的生命周期函数分为两种 应用生命周期函数&#xff1a;整个应用的生命周期函数页面生命后期函数 目录 1 应用生命周期函数 1.1 初始化时 onLanch 1.2 隐藏小程序时 onHide 1.3 显示小程序时 onShow 2 页面生命周期函数 2.1 初始化时 onLoad 2.2 页面显…

C语言写网络爬虫总体思路

使用C语言编写爬虫可以实现网络数据的快速获取和处理&#xff0c;适用于需要高效处理海量数据的场景。与其他编程语言相比&#xff0c;C语言具有较高的性能和灵活性&#xff0c;可以进行底层操作和内存管理&#xff0c;适合处理较复杂的网络请求和数据处理任务。 但是&#xf…

OpenAI网站3月份独立访问量突破8.47亿,增长54%;10分钟搭建自己可免费商用的ChatGPT环境

&#x1f989; AI新闻 &#x1f680; OpenAI网站3月份独立访问量突破8.47亿&#xff0c;增长54% 摘要&#xff1a;据营销机构VezaDigital的调查数据显示&#xff0c;今年3月份共有8.47亿用户访问了OpenAI的网站&#xff0c;比2月份增长了54%。OpenAI是爆火聊天机器人ChatGPT的…

苹果手机备份软件iMazing2023免费版下载

Mazing 则是完全符合用户的使用习惯&#xff0c;可以非常方便地选择一个文件夹即可导入&#xff0c;或者直接像文件管理器那样&#xff0c;用鼠标拖放文件即可完成音乐的传输&#xff0c;简单至极&#xff01;这点 iTunes 是做不到的。iMazing 可以帮助你轻松快速在本地备份自己…

数据中心低压配电系统能耗分析与PUE计算

本篇内容是同为科技&#xff08;TOWE&#xff09;整编的现代化数据中心能耗及PUE的基本概念解读与分析&#xff0c;PUE作为数据中心机房建设节能技术衡量工具&#xff0c;正确理解PUE的涵义&#xff0c;采取针对措施降低PUE值&#xff0c;寻找节能高效与成本合理的平衡点&#…

[2]PCB设计实验|电路板布局布线要求及规律|电抗和电容的关系|8:30~9:30

目录 1.为什么要学习电路板设计&#xff1f; 2.电路板设计目标分析 3.电路设计水平分级与实训目标 4.硬件设计不等于AD使用 5.元件布局纲要 5.1元件布局纲要-机械结构考虑 5.2元件布局纲要-发热器件处理 6.布局和布线的注意事项 6.1布局时的“五个分开” 6.2元件布局…