怎么区分稳定还是不稳定
如果在原序列里面两个数是相同的,那么排完序位置没有发生变化那么 这个排序就是稳定的,如果发生变化那么这个排序就是不稳定的。
冒泡排序(稳定)
考虑冒泡排序的复杂度,对于拥有N个字母的字符串,最多需要交换 N*(N - 1) / 2 次(完全逆序)
快速排序(不稳定)
随机快速排序过程
确定分界点(也叫选择基准数):$q[L], q[(L + R) / 2], q[R]$
调整区间:
![]()
- 递归:处理左右两端排序,如果左右两侧都排序好了在合并一起那么就是一个有序的序列了
(暴力)版
可以先开辟两个空的数组 a[] 和 b[]
在 L 到 R 区间内扫描一遍 把 >= x 和 <= x 的数拆分出来放到 a, b 数组 $q[L - R] $
$q[i] <= x, q[i] - > a[]$ // q[i] <= x 就它放到 a 数组里面
$q[i] >= x, q[i] -> b[]$ // q[i] >= x 就它放到 b 数组里面
$a[] -> q[], b[]->q[]$ //在把 a,b 数组数据在合并到 q 数组里面
(基础)版
我们可以定义两个指针从线段两侧往中间走只要(i < j) 红色i
蓝色j
,如果红色指针要小于基准数那么i++, 如果红色指针要大于基准数了,那么判断j指针数是否大于基准值如果大于那么j++, 如果小于那么 交换i, j 指针。
1 | /************************************************************************* |
归并排序(稳定)
确定分界点 mid(L + R) / 2 (这里的分界点是数组下标的位置)而快排是随机确定数组里面数。
递归排序左右两面。
归并(把排序好的左右两侧合并到一起)。