(1)前期准备参考:代码环境准备
(2)空间复杂度 & 原地算法
- end的定义 :[0,end]范围内都是无序的;当前安排 [0,end]范围内最大元素放在end位置;
- 在完成当前轮排序前:[0,end]是无序的, (end,length-1]是有序的
完成当前轮排序后:[0,end)是无序的, [end,length-1]是有序的
这种优化本质上并没有减少冒泡排序的交换次数,只是在达到有序后,提前终止了循环,减少了循环的轮数;
这种优化本质上也没有减少冒泡排序的交换次数,只是实现了end 跨越,从而减少了比较次数;
- 最坏:O(n2) 完全逆序 从大到小
- 最好:O(n) 完全正序(优化后的冒泡排序,一轮后直接结束程序;如果是经典的,还需要比较,仍然为O(n2))
- 平均:O(n2)
- 空间复杂度:O(1)
- 冒泡排序属于 In-place
- 冒泡排序属于稳定的排序算法
冒泡排序的稳定性取决于 发生交换的判决条件:
- 如果是> 交换,那么两个相等的元素就不会进行交换,在后面的会先放到end,因此是稳定的;
- 如果是>= 交换,那么两个相等的元素会发生交换,破坏了稳定性;
- [0,end]是无序区,每轮在无序区找到最大元素的索引,和end位置的元素进行交换;
- 优势:每一轮end 只发生一次交换操作
- 最坏:O(n2)
- 最好:O(n2)
- 平均:O(n2)
空间复杂度:O(1)
冒泡排序属于 In-place
冒泡排序属于稳定的排序算法
冒泡排序的稳定性取决于 发生交换的判决条件:
如果是>,那么假设有两个最大元素,会将第一个元素放到end位置,因此是不稳定的;
如果是>= ,那么假设有两个最大元素,会将最后面一个元素放到end位置,因此是稳定的;
main方法测试验证:
这里选择排序用的是>=判断条件,可以看出是稳定的;
选择排序因为交换次数远小于冒泡,因此效率高很多;
图解可参考:
https://blog.csdn.net/weixin_43734095/article/details/105108135
认识二叉堆 Heap结构
堆排序:先对无序序列原地建堆,有了堆以后,可以直接选出最大值;
将最大值和elements[size-1]互换,再对elements[0]进行下滤;