go语言实现常用排序算法详解必备

1,202 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第14天,点击查看活动详情

排序算法是在生活中随处可见,也是算法基础,因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题,可以说是每个程序员都必须得掌握的了。为了方便大家学习,花了一天的时间用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
}

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