冒泡、选择、插入排序
冒泡排序
冒泡排序网上有很多资料,只想强调几点:
- 固定往哪个方向冒泡,个人喜欢从左向右冒泡,不要一会向左一会向右,思绪易乱。
- 泡泡到达右边后,相应位置就固定住了,所以下一次无需再经过此处,于是内层循环还要减去外层循环已进行的次数。
- 冒泡时是第 K 个与第 K+1 个元素相比较,所以外层循环次数为 size-1 次即可,最后一个位置无需单独比较。
1 | template<class T, class comparator> |
选择排序
选择排序也只须注意以下几个小坑:
- 外层目标位置 K 确定后,内层从 K+1 位置开始往后遍历。
- 初始 mIndex 值必须等于外层目标位置。
- 由于第 1 点,所以外层 i<size-1,内层 k <size;
1 | template<class T, class comparator> |
插入排序
注意以下几点:
- 由于是 arr[k] 与 arr[k-1] 比较,所以外层从 i=1 开始。当然这只是个人偏好,也可以 arr[k] 与 arr[k+1] 比较。
- 内层从 i 开始。
1 | template<class T, class comparator> |
另外,插入排序是一种不稳定算法,其速度随数据状况而变,即数组越有序其速度越快,而冒泡和选择排序则是稳定的 O(N^2^) 。
这三种排序是最基础的排序算法,即使如此,我们也须额外小心其中的边界处理!
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 极简!
评论