Go语言实现常用排序算法的示例代码

 更新时间:2022年08月11日 11:02:18   作者:yi个俗人  
排序算法是在生活中随处可见,也是算法基础,因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。本文为大家整理了一些Go语言中常用排序算法的实现,需要的可以参考一下

排序算法是在生活中随处可见,也是算法基础,因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题,可以说是每个程序员都必须得掌握的了。为了方便大家学习,花了一天的时间用Go语言实现一下常用的算法且整理了一下,如有需要可以参考。

冒泡排序

思路:从前往后对相邻的两个元素依次进行比较,让较大的数往下沉,较小的网上冒,即每当两个相邻的元素比较后发现他们的排序要求相反时,就将它们互换。

时间复杂度:O(N^2)

空间复杂度:O(1)

func main() {
	fmt.Println(bubbleSort([]int{2, 4, 1, 6, 3}))
}

func bubbleSort(list []int) []int {
	lenth := len(list)
	for i := 0; i <= lenth; i++ {//循环对比的轮数
		exchange := false
		for j := 1; j < lenth-i; j++ {//当前轮相邻元素循环对比
			if list[j-1] > list[j]{//如果前边的大于后边的
				list[j-1], list[j] = list[j], list[j-1]//交换数据
				exchange = true
			}
		}
		if !exchange {
			break
		}
	}
	return list
}

快速排序

思路:以一个基准数将数组拆分为两组,一边大于这个数,一边小于这个数,再最左右两个组重复这个过程,直到各个区域只有一个数。

时间复杂度:O(nlogn)

空间复杂度:O(1)

func quickSort(list []int) []int {
	length := len(list)
	if length <= 1 {
		return list
	}
	//基准值
	base := list[0]
    left := make([]int, 0)
	right := make([]int, 0)
	for i := 1; i < length; i++ {
		if list[i]  > base {
			right  = append(right, list[i])
		} else {
			left = append(left, list[i])
		}
	}
	left, right  = quickSort(left), quickSort(right)
	return append(append(left, base),right...)
}

选择排序

思路:首先找到数组中的最小元素,然后将这个最小元素和数组的第一个元素交换位置,如果第一个元素就是最小元素,就和自己交换位置;再次,在剩下的元素中找到最小元素和数组中的第二个元素交换位置,如此往复,直到将整个数组排序,一句话总结就是,不断在剩余元素中找最小元素。

时间复杂度:O(n^2)

空间复杂度:O(1)

func selectSort(list []int) []int {
	length := len(list)

	for i := 0; i < length; i++ {
		minIndex := i
		//每次循环找出i+1到最后一个元素区间的最小值,然后当前元素和当前最小值比较
		for j := i + 1; j < length; j++ {
			if list[j] < list[minIndex] {
				minIndex = j
			}
		}
		if i != minIndex {
			list[i], list[minIndex] = list[minIndex], list[i]
		}
	}
	return list
}

插入排序

思路:与选择排序一样,当前索引左边的所有元素都是有序的,但是他们的最终位置还不确定,为了给更小的元素腾出空间,他们可能会被移动,但是当索引到达数组的末端,数组排序就完成了。

时间复杂度:O(N^2)

空间复杂度:O(1)

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

排序思路算法几乎一样。 暂时就介绍这几种常用的也是面试中经常问道的排序算法。

到此这篇关于Go语言实现常用排序算法的示例代码的文章就介绍到这了,更多相关Go语言排序算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go实现简单的数据库表转结构体详解

    Go实现简单的数据库表转结构体详解

    这篇文章主要为大家介绍了Go实现简单的数据库表转结构体详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • golang如何通过type定义函数类型

    golang如何通过type定义函数类型

    这篇文章主要介绍了golang如何通过type定义函数类型问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • Golang中interface的基本用法详解

    Golang中interface的基本用法详解

    Go 中接口也是一个使用得非常频繁的特性,好的软件设计往往离不开接口的使用,比如依赖倒置原则(通过抽象出接口,分离了具体实现与实际使用的耦合)。 今天,就让我们来了解一下 Go 中接口的一些基本用法
    2023-01-01
  • 深入了解Golang中占位符的使用

    深入了解Golang中占位符的使用

    在写 golang 的时候,也是有对应的格式控制符,也叫做占位符,写这个占位符,需要有对应的数据与之对应,不能瞎搞。本文就来和大家聊聊Golang中占位符的使用,希望对大家有所帮助
    2023-03-03
  • Go语言使用goroutine及通道实现并发详解

    Go语言使用goroutine及通道实现并发详解

    这篇文章主要为大家介绍了Go语言使用goroutine及通道实现并发详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • golang切片初始化的使用示例

    golang切片初始化的使用示例

    Go语言中,切片可通过直接初始化、数组初始化、切片表达式等多种方法进行初始化,这些方式提供了灵活的数据管理方式,适合不同的编程需求和场景,感兴趣的可以了解一下
    2024-10-10
  • go语言题解LeetCode506相对名次示例详解

    go语言题解LeetCode506相对名次示例详解

    这篇文章主要为大家介绍了go语言题解LeetCode506相对名次示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Go语言实现lru淘汰策略和超时过期

    Go语言实现lru淘汰策略和超时过期

    缓存的大小是有限的,当添加数据发现剩余缓存不够时,需要淘汰缓存中的部分数据,本文主要介绍了Go语言实现lru淘汰策略和超时过期,感兴趣的可以了解一下
    2024-02-02
  • GoFrame gtree树形结构的使用技巧示例

    GoFrame gtree树形结构的使用技巧示例

    这篇文章主要为大家介绍了GoFrame gtree树形结构的使用技巧示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Go语言题解LeetCode1051高度检查器示例详解

    Go语言题解LeetCode1051高度检查器示例详解

    这篇文章主要为大家介绍了Go语言题解LeetCode1051高度检查器示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12

最新评论