八大排序/八大排序口述版/八大排序面试版/八大排序思路(冒泡排序/选择排序/插入排序/希尔排序/归并排序/快速排序/堆排序/基数排序)

在算法和开发的面试中,经常会让你口述一下排序的某个算法的原理和思路,我整理了一下这八大排序的口述思路

1、冒泡排序

  1. 第一个数和第二个数比较,第一个数大则交换
  2. 第二个数和第三个数交换,第三个数大则交换
  3. 一直到最后一个数,则此时最后一个数为最大,最后一个数进入了已排序序列
  4. 重复1-3步骤,继续对前面n-1个数进行排序,完成排序

2、选择排序

  1. 第一步:选择第一个数的索引为最小数的索引
  2. 第二步:对剩下n-1个数进行遍历比较,遇到比当前最小索引数小的数,则更新最小索引
  3. 第三步:将新的最小索引数与第一个数进行交换,第一个数进入已排序序列(如果最小索引没有发生过变化,则不需要交换)
  4. 第四步:重复1-3步骤,继续对后面n-1个数进行排序,完成排序

3、插入排序

  1. 将第一个数与第二个数比较,第一个数大则交换,前面两个数进入已排序序列,第三个数为未排序序列的第一个数
  2. 未排序序列的数与已排序序列的所有数进行比较,将当前未排序序列的数插入到已排序序列的数
  3. 重复这个过程,完成排序

4、希尔排序

希尔排序也是插入排序的一种,对直接插入排序进行了改进,它采用了一种分组的策略使用直接插入排序,让排序的效率变得更高。分组数(也就是常说的gap,增量)

  1. 设为gap = n/2,向下取整,对gap个分组的每个小组的数进行直接插入排序
  2. 将gap更新为gap = gap /2,向下取整,对gap个分组的每个小组的数进行直接插入排序
  3. 重复这个过程直到gap为1,就是一个分组,即对整个数组进行一次直接插入排序

比如有10个数,第一次分组数就是10/2=5,这个5个分组对应的数的序号为:

(1,6)(2,7)(3,8)(4,9)(5,10)

对5个小组的所有数都进行一次直接插入排序

第二次分组数为5/2 = 2,这2个分组对应的数的序号为:

(1,3,5,7,9)(2,4,6,8,10)

对2个小组的所有数都进行一次直接插入排序

5、归并排序

归并排序

主要采用分割和合并的思路进行排序

  1. 将数组按照最中间索引,分割为左右两个数组(奇数个数的数组左右两个数组的元素个数相差为1)
  2. 将左右两个数组继续分割为左右两个数组,直到分割到数组只有一个元素
  3. 创建一个空的数组,依次遍历左右数组,比较左右数组的第一个元素的大小,较小的那个元素从对应数组中弹出
  4. 重复3的过程,直到两个数组的元素都弹出,即都合并到了新数组中
  5. 按照1、2分割的方式,重复3、4的过程,继续合并左右数组,直到合并至最后一个数组完成排序

因此可以看出归并排序需要的内存资源明显比较大(空间复杂度较高)

6、快速排序

相关推荐
做cv的小昊10 分钟前
大语言模型系统:【CMU 11-868】课程学习笔记02——GPU编程基础1(GPU Programming Basics 1)
人工智能·笔记·学习·语言模型·llm·transformer·agent
xsyaaaan2 小时前
leetcode-hot100-双指针:283移动零-11盛最多水的容器-15三数之和-42接雨水
算法·leetcode
炽烈小老头5 小时前
【每天学习一点算法 2026/03/08】相交链表
学习·算法·链表
一碗白开水一6 小时前
【工具相关】OpenClaw 配置使用飞书:打造智能飞书助手全流程指南(亲测有效,放心享用)
人工智能·深度学习·算法·飞书
仰泳的熊猫6 小时前
题目2194:蓝桥杯2018年第九届真题-递增三元组
数据结构·c++·算法
Tisfy6 小时前
LeetCode 1888.使二进制字符串字符交替的最少反转次数:前缀和O(1)
算法·leetcode·字符串·题解
日更嵌入式的打工仔7 小时前
个人笔记3
笔记
滴滴答滴答答7 小时前
机考刷题之 9 LeetCode 503 下一个更大元素 II
算法·leetcode·职场和发展
飞Link7 小时前
梯度下降的优化算法中,动量算法和指数加权平均的区别对比
人工智能·深度学习·算法
啊哦呃咦唔鱼7 小时前
LeetCode hot100-15 三数之和
数据结构·算法·leetcode