冒泡排序
思想:各数之间两两比较,大的数往后移动
时间复杂度: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
}