首页 > 其他分享 >使用go语言实现快速排序、归并排序、插入排序、冒泡排序、选择排序

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

时间:2024-07-04 20:02:46浏览次数:23  
标签:arr int 插入排序 元素 冒泡排序 ++ 数组 排序

  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
}

标签:arr,int,插入排序,元素,冒泡排序,++,数组,排序
From: https://blog.csdn.net/a1546464545454/article/details/140188247

相关文章

  • Java实现简单的冒泡排序
    Java实现简单的冒泡排序核心思想:把相邻的两个数字两两比较,当一个数字大于右侧相邻的数字时,交换他们的位置,当一个数字和他右侧的数字小于或等于的时候,不交换。(小到大排序)例如有数组{3,1,5,7,4,2}第一次排序{3,1,5,7,4,2}//开始{1,3,5,7,4,2}//1和3互换{1,3,5,7,4,2......
  • PHP桶排序:优化大数据集的高效算法解析与实践
    本文由ChatMoney团队出品本文将介绍一种在PHP中实现的高效排序算法——桶排序。通过使用桶排序,可以快速地对大数据集进行排序,特别是在数据分布均匀的情况下。文章将简要介绍桶排序的原理,并给出一个具体的PHP实现示例。一、桶排序原理桶排序(BucketSort)是一种将待排序数......
  • PHP桶排序:高效处理大数据集的算法解析与实现
    本文由ChatMoney团队出品本文将介绍一种在PHP中实现的高效排序算法——桶排序。通过使用桶排序,可以快速地对大数据集进行排序,特别是在数据分布均匀的情况下。文章将简要介绍桶排序的原理,并给出一个具体的PHP实现示例。一、桶排序原理桶排序(BucketSort)是一种将待排序数......
  • 【社招+校招】华为OD机试 - 运维日志排序(Java & JS & Python & C)
    鱼弦:公众号【红尘灯塔】,CSDN博客专家、内容合伙人、新星导师、全栈领域优质创作者、51CTO(Top红人+专家博主)、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)运维日志排序算法实现(Java、JavaScript、Python、C、C++)算法概述运维日志......
  • Python基础小知识问答系列-字典列表根据字典key排序
    1.问题:    现有一个列表,需要根据字典元素的某个键,进行排序,该怎样实现?2.解决方法:    排序使用sorted函数,通过operator模块中的itemgetter函数实现指定key。示例:fromoperatorimportitemgetterfrompprintimportpprinttest_list=[1,3,6,2,9,......
  • 1.选择排序(C++)
    //算法步骤//1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。//2.再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。//3.重复第二步,直到所有元素均排序完毕。//以下是代码实现//选择排序#include<iostream>#include<iomanip>using......
  • 快速排序
    #也是用到过,找出数组中最大值deffind_bigest(arr):if(len(arr)==1):returnarr[0]if(arr[0]>arr[-1]):returnfind_bigest(arr[:-1])else:returnfind_bigest(arr[1:])_=[1,45,467,123,8,2,63,]print(find_bigest(_))imp......
  • 【算法】十大排序算法
    冒泡排序算法思想:基于比较的思想,从第一个元素开始,依次比较相邻两个元素大小,较大者放在后面,经过一轮后,最大的元素位于最后(最大元素不断冒泡到最后的位置),重复n轮。选择排序算法思想:基于比较的思想,维护一个记录最大值的变量,遍历所有元素找到最大值所在位置,将其与最后的位置交换......
  • 排序函数
    1.std::sort(不稳定排序,时间复杂度为O(nlogn)) std::vector<int>list;std::sort(list.begin(),list.end());//默认升序std::less<int>();std::sort(list.begin(),list.end(),std::greater<int>());//降序autocmp=[](intx,inty){returnx<y;};std::s......
  • laravel 数组元素按中文排序
    1、按英文排序$r=[['color'=>'b','color_zh'=>'波'],['color'=>'c','color_zh'=>'吃'],['color'=>'a','color_zh'=>'啊......