排序算法快速记忆

基础概念

1,插入排序(以第一个元素先入序列,然后逐个入序列)

从第一个元素开始,该元素可以认为已经被排序,然后取出下一个元素,从已排序的元素序列从后往前扫描,如果大于就在后面,如果小于就放前面

2,希尔排序(index增量对比,增量递减至1)

1,先选定一个增量(第一次是个数除以二),然后将所有距离为gap的元素分在同一组,进行对比,比如10个数,增量是10/2=5,所以第一个数和第六个数对比,如果第六个比较大,就互换位置,直到第五个被执行完,然后增量=5/2=2,重复该步骤

2,当增量的大小减到1时的排序,等于排序完成

3,选择排序(从候选中挑选入序列)

最简单的做法就是每次从候选中挑选一个最小值放入序列,优化做法是每次从候选中挑选最大和最小值,分别放序列的两头

4,冒泡排序(对比右移动)

从第一数开始,逐个对比,如果比较大,就向右移动一位

5,堆排序(完全二叉树)

堆排序是一种不稳定的排序算法,它利用堆这种数据结构进行排序。堆排序的时间复杂度为O(nlogn),在原数据上进行排序,空间复杂度为 O(1)。但是,由于堆排序过程中必须先构建一个堆,因此需要占用额外的空间来存储堆。

6,快速排序(左右两边指针移动对比,停止指针位互换)

左右端最后一个分别是LR向中间走,但是位置并未变动,当左边走到比自己大的就停止,当右边遇到比自己小的也停止,然后指针的两个下标数据互换,互换结束后继续往前走,当两个指针碰一起,也就是index相同的时候,对比index的数据与两个端的大小,然后进行互换操作。这种算法快,复杂度是n*log2^n

简而言之,就是确定一个数作为基准,然后对比另一边,假设另一半大,就互换,然后基位到了另一边,反过来继续对比。

  • 假如数组是{2,8,7,1,3,5,6,4},以最后一个元素为基准元素,排序后结果是:{2,3,1,4,7,5,6,8}

1.起始指针位在index7,数字是4,对比左边指针位index0,数字是2,2比4小,对比下一位8 =》{2,8,7,1,3,5,6,4}

2.左指针位值 8 比右指针位值 4 大,位置互换,基准跳到左指针index1 =》{2,4,7,1,3,5,6,8}

3.重复一二步骤,左(1,4)比右(6,6)(5,5)都小,比(4,3)大,所以进行一次互换,基准位跳到4 =》{2,3,7,1,4,5,6,8}

4.基准位右指针位值 4)比左指针位值 7)小,互换,基准位跳到2 =》{2,3,4,1,7,5,6,8}

5.基准位左指针位值 4)比右指针位值 1)大,互换,基准位跳到3 =》{2,3,1,4,7,5,6,8}

7,归并排序

归并排序是一种稳定的、基于比较的排序算法,采用分治思想,将待排序列分成若干个子序列,对每个子序列进行内部排序,最后合并各个有序子序列,得到完整的有序序列。归并排序的时间复杂度为 O(nlogn),可以保证排序的稳定性。

总结

  • 插入排序:先从候选中选择一个,然后逐个拿来对比,与新的序列进行对比,然后插入新序列。(需要新增数组)
    选择排序:每次从候选中选择一个最小或者最大值,插入新的序列(需要新增数组)
  • 希尔排序:折中取对比偏移量,逐个根据偏移量进行数据对比和互换,结束后继续折中偏移量(无需新增数组)
  • 冒泡算法:下标位进行遍历对比,直接在原来的列表上进行换位置,注意这里并非固定某一个候选值与其他进行对比。(无需新增数组)
  • 堆排序:不稳定排序,(时间复杂度O(nlogn),空间复杂度为O(1),需新增一个堆)
  • 归并排序:稳定排序,分治思想。(时间复杂度O(nlogn))
  • 快速排序:挑选最后一个作为候选值,先左边逐个对比,遇到比自己大则互换,然后与右边互换位置向左逐个对比,遇到比自己小则互换。相当于拿一个值作为标准,通过左右不断互换的方式让这个标准值的左边比自己小,右边比自己大。所以快速排序得到的结果并非一定是顺序的。

归纳

  • 1,插入排序和选择排序,都是针对数值,讲究的是从原来数组中挑选出来得到一个新数组,一个是拿出来后对比插入,另一个是先对比后直接拿出来放入,都需要创建一个新数组。

  • 2,希尔排序、冒泡排序和快速排序,都是针对下标,一个是偏移对比,一个是逐个对比,最后一个是左右下标偏互换,都是在自身数组上操作。

相关推荐
绿智校园1 分钟前
物联网平台选型指南:为什么底层协议自研比云端SDK接入更可靠?
java·物联网·struts
T01156182 分钟前
艺培场馆课时预约小程序用户端 & 后台联动踩坑上篇(预约、课时、缓存、消息、学员端自身问题)
java·缓存·小程序·bug·全栈项目实战手记·艺培课时系统‘’
长谷深风1114 分钟前
AI Agent 踩坑:盲目重试会把小故障炸成系统灾难
java·大数据·ai·agent·ai agent·工具调用·agent设计
探物 AI24 分钟前
机器人清理墙角蜘蛛网,背后需要哪些算法?——从视觉分割到贴墙力控
算法·机器人
青 春 记 忆27 分钟前
LeetCode 226. 翻转二叉树|Python 解法详解
python·算法·leetcode
evans在进步28 分钟前
Spring Boot 核心机制详解:自动装配、事件监听、异步任务与请求映射
java·spring boot·后端
Zane199434 分钟前
HashSet、TreeSet、LinkedHashSet:底层都是"套壳"
java·后端
民乐团扒谱机39 分钟前
【微科普】压缩感知(CS):违反了奈奎斯特采样定理?不先采集也能还原信号?大白话讲透稀疏采样、L1重建与OMP,一文吃透附代码
python·神经网络·线性代数·算法·数学建模·压缩感知·奈奎斯特
88号技师40 分钟前
2026年SCI-分数牛顿衍生优化算法Fractional Newton-derived optimizer-附Matlab免费代码
开发语言·算法·数学建模·matlab·优化算法
相顾若初见1 小时前
RuoYi后端jar镜像制作
java·jar