算法稳定性,时间复杂度,空间复杂度等算法基础知识:经典算法----基础知识
冒泡排序:基础算法----冒泡排序
选择排序:基础算法----选择排序
插入排序:基础算法----插入排序
快速排序:基础算法----快速排序
希尔排序:基础算法----希尔排序
归并排序:基础算法----归并排序
计数排序:基础算法----计数排序
桶排序: 基础算法----桶排序
基数排序:基础算法----基数排序
堆排序: 基础算法----堆排序
一 算法简介
冒泡排序会依次比较两个相邻的元素, 如果顺序错误则交换位置, 重复此过程直到没有相邻元素需要交换
冒泡排序的效率较低,冒泡排序是一种简单的排序算法,适用于小规模数据排序
二 时间复杂度,空间复杂度
一) 时间复杂度
循环次数
最好情况(与期望顺序相同)/最坏情况(与期望顺序相反)的循环次数(比较次数)都一样:
T(n) = (n-1) + (n-2) + (n-3) + … + 1
= n(n-1)/2
位置交换次数
最好情况: 0次交换
最坏情况: n(n-1)/2
平均时间复杂度为T(n) = O(n2)
二) 空间复杂度
冒泡排序不需要额外的空间,所以空间复杂度为 S(n) = O(1)
三 算法稳定性
相邻的两个元素比较,顺序错误则交换位置,如果相邻的两个元素相等,不会交换位置
如果两个相等的元素没有相邻,那么即使通过交换把两个元素相邻起来,也不会交换位置
排序完成后相同元素的前后顺序没有改变,冒泡排序是一种稳定的排序算法
四 实现
一) 排序过程
使用{50, 40, 30, 20, 10}演示从小到大的排序过程
其中
第一趟
第二趟
第三趟
第四趟
二) 基于golang代码实现
1 基础版
外层循环表示比较的趟数,内层循环表示对每一趟中未排好序的元素进行排序
每一趟确定一个最值(最大值/最小值)
func BubbleSort(arr []int) {
if len(arr) <= 1 {
return
}
for i := 0; i < len(arr)-1; i++ {
for j := 0; j < len(arr)-1-i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
}
}
}
return
}
2 优化版
基于基础版的优化:如果经过前面几趟的排序后已经与期望顺序相同,那后面的几趟排序就不需要执行了
每一趟排序开始将一个标志设置为false,在这趟排序中,如果发生了数据交换,将该标志设置为true;如果没发生数据交换,则依然为false
当每一趟排序结束,检查该标志的值,如果没发生数据交换,说明此时的顺序与期望顺序相同, 退出
func BubbleSort(arr []int) {
if len(arr) <= 1 {
return
}
for i := 0; i < len(arr)-1; i++ {
swapBool := false
for j := 0; j < len(arr)-1-i; j++ {
if arr[j] > arr[j+1] {
arr[j], arr[j+1] = arr[j+1], arr[j]
swapBool = true
}
}
if !swapBool {
break
}
}
return
}