冒泡排序、选择排序

250 阅读2分钟

冒泡排序

思想:各数之间两两比较,大的数往后移动

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

稳定性:稳定(注意,也有可能不稳定)

代码实现

func bSort(arr []int)[]int{
    l := len(arr)
    for i:=0;i<l-1;i++{ // n个数,只需要比较n-1次即可
        for j:=0;j<l-i-1;j++{ //每完成一次外层循环,则会有一个数确定,因此只需要比较l-i-1次
            if arr[j]>arr[j+1]{ // 如果这里是>=,则算法变成不稳定,因此要注意
                arr[j],arr[j+1] = arr[j+1],arr[j] // 交换位置
            }
        }
    }
    return arr
}

优化

func gbSort(arr []int)[]int{
    l := len(arr)
    for i:=0;i<l-1;i++{ // n个数,只需要比较n-1次即可
        var flag = false
        for j:=0;j<l-i-1;j++{ //每完成一次外层循环,则会有一个数确定,因此只需要比较l-i-1次
            if arr[j]>arr[j+1]{ // 如果这里是>=,则算法变成不稳定,因此要注意
                arr[j],arr[j+1] = arr[j+1],arr[j] // 交换位置
                flag = true
            }
        }
        if !flag {
            break // 如果一次都没有发生交换,则说明已经排好序,直接挑出循环
        }
    }
    return arr
}

选择排序

思想:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零 -- 百度百科

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

稳定性:不稳定

代码实现

func selectSort(arr []int) []int {
	l := len(arr)
	for i := 0; i < l; i++ {
		data := arr[i]
		for j := i + 1; j < l; j++ {
			if data > arr[j] {
				data = arr[j] // 需要记住最小的值
				arr[i], arr[j] = arr[j], arr[i]
			}
		}
	}
	return arr
}