使用go语言实现快速排序、归并排序、插入排序、冒泡排序、选择排序

news/2024/7/7 19:39:23 标签: 算法, 数据结构, 排序算法, golang
  1. 冒泡排序(Bubble Sort)
  • 原理:比较相邻的元素,如果前一个比后一个大,就交换它们。这个过程会使得每一轮最大的元素“冒泡”到数组的末尾。
  • 时间复杂度:O(n^2)
  • 稳定性:稳定
// BubbleSort 函数使用冒泡排序算法对数组进行排序
func BubbleSort(arr []int) {
	n := len(arr)
	for i := 0; i < n; i++ {
		for j := 0; j < n-i-1; j++ {
			if arr[j] > arr[j+1] {
				// 交换 arr[j] 和 arr[j+1]
				arr[j], arr[j+1] = arr[j+1], arr[j]
			}
		}
	}
}

  1. 选择排序(Selection Sort)
  • 原理:从未排序的部分中选出最小的元素,将其放在已排序部分的末尾。
  • 时间复杂度:O(n^2)
  • 稳定性:不稳定
// SelectionSort 函数使用选择排序算法对数组进行排序
func SelectionSort(arr []int) {
   n := len(arr)
   for i := 0; i < n-1; i++ {
      // 找到未排序部分中最小的元素
      minIdx := i
      for j := i + 1; j < n; j++ {
         if arr[j] < arr[minIdx] {
            minIdx = j
         }
      }
      // 将找到的最小元素与未排序部分的第一个元素交换
      arr[i], arr[minIdx] = arr[minIdx], arr[i]
   }
}

  1. 插入排序(Insertion Sort)
  • 原理:每次将一个新的元素插入到已排序部分的正确位置。
  • 时间复杂度:O(n^2)
  • 稳定性:稳定
// InsertionSort 函数使用插入排序算法对数组进行排序
func InsertionSort(arr []int) {
	n := len(arr)
	for i := 1; i < n; i++ {
		key := arr[i]
		j := i - 1

        // 移动 arr[0..i-1] 中大于 key 的元素到当前元素的下一个位置
		for j >= 0 && arr[j] > key {
			arr[j+1] = arr[j]
			j = j - 1
		}
		arr[j+1] = key
	}
}
  1. 快速排序(Quick Sort)
  • 原理:选择一个基准元素,将数组划分为两个子数组,使得一个子数组中的所有元素都比基准元素小,另一个子数组中的所有元素都比基准元素大,然后递归地排序这两个子数组。
  • 时间复杂度:平均O(n log n),最坏O(n^2)
  • 稳定性:不稳定
// QuickSort 函数使用快速排序算法对数组进行排序
func QuickSort(arr []int, low, high int) {
	if low < high {
		// pi 是分区索引,arr[pi] 现在位于正确的位置
		pi := partition(arr, low, high)

		// 递归地对分区索引前后的元素进行排序
		QuickSort(arr, low, pi-1)
		QuickSort(arr, pi+1, high)
	}
}

// partition 函数以最后一个元素为基准,将基准元素放置在其正确的位置,
// 并将所有小于基准的元素移到基准的左边,大于基准的元素移到基准的右边
func partition(arr []int, low, high int) int {
	pivot := arr[high] // 选择最后一个元素作为基准
	i := low - 1       // 较小元素的索引

	for j := low; j < high; j++ {
		// 如果当前元素小于或等于基准
		if arr[j] <= pivot {
			i++ // 增加较小元素的索引
			// 交换 arr[i] 和 arr[j]
			arr[i], arr[j] = arr[j], arr[i]
		}
	}
	// 交换 arr[i+1] 和 arr[high] (基准)
	arr[i+1], arr[high] = arr[high], arr[i+1]

	return i + 1
}
  1. 归并排序(Merge Sort)
  • 原理:将数组分成两个子数组,分别排序后再合并。
  • 时间复杂度:O(n log n)
  • 稳定性:稳定
// MergeSort 函数使用归并排序算法对数组进行排序
func MergeSort(arr []int) []int {
	if len(arr) <= 1 {
		return arr
	}

	// 将数组分成两半
	mid := len(arr) / 2
	left := MergeSort(arr[:mid])
	right := MergeSort(arr[mid:])

	// 合并两个有序的子数组
	return merge(left, right)
}

// merge 函数合并两个有序的子数组
func merge(left, right []int) []int {
	var result []int
	i, j := 0, 0

	// 合并两个子数组
	for i < len(left) && j < len(right) {
		if left[i] < right[j] {
			result = append(result, left[i])
			i++
		} else {
			result = append(result, right[j])
			j++
		}
	}

	// 将剩余的元素添加到结果数组中
	for i < len(left) {
		result = append(result, left[i])
		i++
	}
	for j < len(right) {
		result = append(result, right[j])
		j++
	}

	return result
}

http://www.niftyadmin.cn/n/5535103.html

相关文章

DIY智能音箱:基于STM32的低成本解决方案 (附详细教程)

摘要: 本文详细介绍了基于STM32的智能音箱的设计与实现过程&#xff0c;包括硬件设计、软件架构、语音识别、音乐播放等关键技术。通过图文并茂的方式&#xff0c;结合Mermaid流程图和代码示例&#xff0c;帮助读者深入理解智能音箱的工作原理&#xff0c;并提供实际操作指导。…

SpringBoot 启动流程一

SpringBoot启动流程一 我们首先创建一个新的springboot工程 我们不添加任何依赖 查看一下pom文件 我们创建一个文本文档 记录我们的工作流程 我们需要的是通过打断点实现 我们首先看一下启动响应类 package com.bigdata1421.start_up;import org.springframework.boot.Spr…

Linux 程序置顶脚本

引言 当希望我们运行的程序&#xff0c;一直保持在最顶端运行&#xff0c;即置顶状态&#xff0c;那么有很多种方式&#xff0c;这边给出一种脚本方式处理。 通过持续监控&#xff0c;当发现活动窗口不是我们所希望的窗口时&#xff0c;将我们希望置顶的程序窗口置顶。 脚本 …

docker初始化运行mysql容器时自动导入数据库存储过程问题

问题&#xff1a;用navicat导出的数据库脚本&#xff0c;在docker初始化运行mysql容器时&#xff0c;导入到存储过程时出错。 ERROR 1064 (42000) at line 2452: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for t…

AI:开发者的超级助手,而非取代者

AI&#xff1a;开发者的超级助手&#xff0c;而非取代者 引言 在这个日新月异的科技时代&#xff0c;人工智能&#xff08;AI&#xff09;已悄然渗透到我们生活的方方面面&#xff0c;尤其是在软件开发领域&#xff0c;它正以一种前所未有的方式改变着我们的工作方式。作为一名…

删除账户相关信息

功能需求 获取正确的待删除账户名杀死系统中正在运行的属于该账户的进程确认系统中属于该账户的所有文件删除该账户 1. 获取正确的待删除账户名 #让用户输入账户名 read -t 10 -p "please input account name: " accountif [ -z $account ] thenecho "account…

手机取证基础知识(一)

文章关键词&#xff1a;手机取证、电子数据取证 手机取证&#xff0c;也称为移动设备取证或智能手机取证&#xff0c;是数字取证的一个分支&#xff0c;专注于从智能手机和其他移动设备中提取、分析和呈现证据的过程。这项技术通常用于法律调查&#xff0c;尤其是在犯罪调查中…

notepad++安装并打开json文件

1、notepad安装 1、首先下载Notepad.exe 2、选择简体中文安装 点击下一步 点击“我接受” 选择安装目录&#xff0c;进行下一步安装 默认下一步 选择安装 等待安装完成 点击完成 2、保存json文件 复制返回结果 先把返回结果复制出来。保存到text里面 把文件另存为json格式 3、…