交换类排序的排序趟数与原始状态有关
两个两个的依次比较,把大的放后边小的放前边,循环到全部排序完成(没有发生交换)即可
空间复杂度:O(1)
时间复杂度:O(n2)
稳定排序
每一趟最后一个元素都是最大的元素(从小到大排序)
元素从小到大时
快速排序基于分治法(每次都给他分成更小的块进行排序,分而治之)
任取一个枢轴赋值给pivot
,把数组分成小于pivot
的和大于pivot
的两个数组
然后对这两个数组再重复这种方法直到数组的大小为1或空
空间复杂度:O(log2n)
分治法一般用递归实现,所以容量应该于递归调用的最大深度一致
时间复杂度:O(nlog2n)
不稳定排序
平均性能最优的内部排序
每次排序后枢轴一定在排序的最终位置上(用于计算某一趟结果的题)
适合数据随机或者数据量很大的时候,不适合基本已经有序的
枢轴把两边数组分成等长时速度最快
46
小的(40
)进行交换{40, 79, 56, 38, 46, 84}
46
大的(79
)进行交换{40, 46, 56, 38, 79, 84}
46
小的(38
)进行交换{40, 38, 56, 46, 79, 84}
46
大的(56
)进行交换{40, 38, 46, 56, 79, 84}
46
处于最终位置,最后一个结果即为一次划分的结果
角标 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
原数组 | 2 | 1 | 4 | 9 | 8 | 10 | 6 | 20 |
最终数组 | 1 | 2 | 4 | 6 | 8 | 9 | 10 | 20 |
1
冒泡到最前面,数组变成{1, 8, 9, 10, 4, 5, 6, 20, 2}
2
冒泡到最前面,数组变成{1, 2, 8, 9, 10, 4, 5, 6, 20}
4
冒泡到最前面,数组变成{1, 2, 4, 8, 9, 10, 5, 6, 20}
5
冒泡到最前面,数组变成{1, 2, 4, 5, 8, 9, 10, 6, 20}
6
冒泡到最前面,数组变成{1, 2, 4, 5, 6, 8, 9, 10, 20}
{9, 17, 5, 21, 25, 23, 30}
, 第二次分为{17, 9, 5, 21, 23, 25, 30}
;逆序数=2{9, 23, 5, 17, 21, 25, 30}
, 第二次分为{5, 9, 23, 17, 21, 25, 30}
;逆序数=3{5, 9, 17, 21, 25, 23, 30}
, 第二次分为{5, 9, 17, 21, 23, 25, 30}
;逆序数=4{5, 9, 17, 21, 23, 25, 30}
, 第二次分为{5, 9, 17, 21, 23, 25, 30}
;逆序数=0{35, 30, 88, 42, 92, 96, 110, 100}
;有4个元素移动了,交换了3次{88, 30, 35, 42, 92, 110, 100, 96}
;有8个元素移动了,交换了7次{42, 96, 92, 35, 30, 88, 100, 110}
;有4个元素移动了,交换了3次{35, 30, 42, 92, 100, 96, 88, 110}
;有2个元素移动了,交换了1次11 | 18 | 23 | 68 | 69 | 73 | 93 | |
I | 68 | 11 | 18 | 69 | 23 | 93 | 73 |
II | 68 | 11 | 69 | 23 | 18 | 93 | 73 |
III | 93 | 73 | 68 | 11 | 69 | 23 | 18 |
IV | 68 | 11 | 69 | 23 | 18 | 73 | 93 |
2 | 5 | 12 | 16 | 28 | 32 | 60 | 72 | |
A | 5 | 2 | 16 | 12 | 28 | 60 | 32 | 72 |
B | 2 | 16 | 5 | 28 | 12 | 60 | 32 | 72 |
C | 2 | 12 | 16 | 5 | 28 | 32 | 72 | 60 |
D | 5 | 2 | 12 | 28 | 16 | 32 | 72 | 60 |