经典排序算法(冒泡排序、选择排序、插入排序)

news/2025/2/16 4:52:24/

1. 冒泡排序

1.1 算法步骤

  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

1.2 动图演示

冒泡排序

1.3 代码实现

func BubbleSort(nums []int)  []int {for i:=0;i<len(nums);i++ {for j:=0;j<len(nums)-1;j++ {if nums[j] > nums[j+1] {nums[j], nums[j+1] = nums[j+1], nums[j]}}}return nums
}

2. 选择排序

2.1 算法步骤

  • 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
  • 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
  • 重复第二步,直到所有元素均排序完毕。

2.2 动图演示

select

2.3 代码实现

func selectionSort(arr []int) []int {for i := 0; i < len(arr)-1; i++ {min := ifor j := i + 1; j < len(arr); j++ {if arr[j] < arr[min] { // 寻找最小的数min = j // 将最小数的索引保存}}arr[i], arr[min] = arr[min], arr[i]}return arr
}

3. 插入排序

3.1 算法步骤

  • 将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
  • 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面)

3.2 动图演示

insert

3.3 代码实现

func insertionSort(arr []int) []int {var i, j intfor i = 1; i < len(arr); i++ {current := arr[i]for j = i - 1; j >= 0; j-- {if current < arr[j] {arr[j+1] = arr[j]} else {break}}arr[j+1] = current}return arr
}

原文地址:https://www.runoob.com/w3cnote/ten-sorting-algorithm.html


http://www.ppmy.cn/news/603059.html

相关文章

Docker 入门系列(8)— 免 sudo 使用 docker 命令、进入未启动的容器

1. 免 sudo 使用 docker 命令 如果还没有 docker group 就添加一个 sudo groupadd docker将用户加入该 group 内 sudo gpasswd -a ${USER} docker重启 docker 服务 sudo service docker restart切换当前会话到新 group 或者重启 X 会话 newgrp - docker注意&#xff1a;最…

RabbitMQ 入门系列(12)— 交换器分类(direct、fanout、topic)

RabbitMQ的 Exchange&#xff08;交换器&#xff09;分为四类&#xff1a; direct&#xff08;默认&#xff09;headersfanouttopic 其中 headers 交换器允许你匹配 AMQP 消息的 header 而非路由键&#xff0c;除此之外 headers 交换器和 direct 交换器完全一致&#xff0c;但…

libavcodec-ffmpeg.so.56 cannot open shared object file

1. 问题现象 ImportError: libavcodec-ffmpeg.so.56: cannot open shared object file: No such file or directory2. 解决方法 sudo apt-get install libavcodec-dev sudo apt-get install libavformat-dev sudo apt-get install libswscale-dev

查找数组中唯一重复的元素和查找数组中丢失的数(哈希法和异或法)

1. 问题 假设数组元素为分别为 1-N&#xff0c;一共 N1 个&#xff0c;其中只有一个元素重复出现&#xff0c;其它元素只出现一个&#xff0c;找出这个重复的元素 2. 思路 2.1 使用 Hash 方法 将出现的元素依次放到一个 hash 表中&#xff0c;每个元素值作为 hash 的 key &am…

查找数组元素最大值和最小值(分治法)

1. 问题 给定一个数组&#xff0c;要求找出数组中的最大值和最小值&#xff0c;假设数组中的值两两各不相同 2. 思路 2.1 首元素比较法 定义变量 max、min &#xff0c; 分别将第一个元素分别赋值给这两个变量&#xff0c;然后依次遍历数组中的全部元素&#xff0c;如果比 ma…

超级实用的思维导图软件

如果你正在寻找一款超级实用的思维导图软件&#xff0c;那么我强烈推荐你使用ProcessOn。这款软件不仅功能强大&#xff0c;而且易于使用&#xff0c;可以帮助你更好地组织和管理工作流程、学习笔记、项目管理等。 首先&#xff0c;让我们来看看ProcessOn的优点。它提供了丰富的…

数组按位置旋转(循环移位)

1. 问题 给定一个数组&#xff0c;按照给定的索引位置旋转&#xff0c;如数组 a [1,2,3,4,5,6,7,8,9]&#xff0c;按照给定索引位置 4 翻转后&#xff0c;输出为 [6,7,8,9,1,2,3,4,5] 2. 思路 2.1 可以直接利用切片索引性质求解 a [1,2,3,4,5,6,7,8,9]&#xff0c;先计算出…

对有大量重复数字的数组进行排序(哈希表应用)

1. 问题 给定一个数组&#xff0c;已知这个数组中有大量的重复数字&#xff0c;如何对这个数组进行高效地排序 2. 思路 常规排序法没有用到大量重复数字这个特性&#xff0c;应该想到用 hash 表来解决这个问题 3. 代码实现 package mainimport ("fmt""sort&q…