算法稳定性,时间复杂度,空间复杂度等算法基础知识:经典算法----基础知识
冒泡排序:基础算法----冒泡排序
选择排序:基础算法----选择排序
插入排序:基础算法----插入排序
快速排序:基础算法----快速排序
希尔排序:基础算法----希尔排序
归并排序:基础算法----归并排序
计数排序:基础算法----计数排序
桶排序: 基础算法----桶排序
基数排序:基础算法----基数排序
堆排序: 基础算法----堆排序
一 算法介绍
从未排序序列中找到最小/大元素,存放到已排序序列的末尾,重复此过程,直到未排序序列的元素个数为零
虽然交换次数比冒泡少,但和冒泡排序一样效率低
二 时间复杂度,空间复杂度
一) 时间复杂度
循环次数
最好情况(与期望顺序相同)/最坏情况(与期望顺序相反)的循环次数都一样:
T(n) = (n-1) + (n-2) + (n-3) + … + 1
= n(n-1)/2
位置交换次数
最好情况:交换0次
最坏情况:交换n-1次
平均时间复杂度为T(n) = O(n2)
二) 空间复杂度
选择排序不需要额外的空间,空间复杂度为 S(n) = O(1)
三 算法稳定性
如果一个元素比当前元素小,而该元素又出现在一个和当前元素相等的元素后面,那么交换后稳定性就被破坏了,选择排序是一种不稳定的排序算法
如序列 [4, 5, 4, 2, 8, 9],在一趟选择中,第1个元素4和2交换,那么原序列中两个4的相对前后顺序就被破坏了
四 实现
一) 步骤
1) 选择当前位置作为最小值
2) 和当前位置后面的依次比较,获取最小值的位置
3) 当前位置和最小值的位置交换
4) 重复步骤1), 2), 3),直到当前位置是序列的最后一个元素
二) 过程图
使用 {40, 30, 50, 40, 20, 60, 10, 70} 演示从小到大的排序过程
初始状态
1) 外层第一次循环
2) 外层第二次循环
3) 外层第三次循环
4) 外层第四次循环
5) 外层第五次循环
6) 外层第六次循环
7) 外层第七次循环
8) 外层第八次循环
三) 代码实现
func SelectSort(arr []int) {
if len(arr) <= 1 {
return
}
for i := 0; i < len(arr)-1; i++ {
//最小值元素的索引,每个位置(i),只需和它后面的元素[i+1, len(arr)]比较
minIndex := i
for j := i+1; j < len(arr); j++ {
if arr[j] < arr[minIndex] {
minIndex = j
}
}
if i != minIndex {
arr[i], arr[minIndex] = arr[minIndex], arr[i]
}
}
return
}