快排的真谛在于 极端情况下每次将概率等分 1/2 每次小于这个数的放在前面 大于的放在后面 即每次排序都找出了一个正确位置,
使得下一次排序个数减少一半。
然而partion基准却并不好找,也并不稳定。 比如 在有序序列下(1,2,3,4,5.。。。) 每次比较得到基准就不会减少1/2的数量,
空间复杂度成为O(n2) 退化成冒泡排序。
1.固定取基准 : 这也是在序列有序的情况下,排序最容易退化成冒泡的方法
2.随机取基准 :也就是每次在要排序的序列区间内 随意找到一个定为基准(这种方法看人品,随机的好就接近于1/2)
3.三数取中法 :每次找基准前让 (low +high)/2 中得到 mid 元素 然后让 array[mid] < array[low] < array[high]
下面代码就是三数取中法代码
//快排
//时间复杂度O(nlbn)
//空间复杂度O(lbn)
//不稳定
public static void quickSort1(int[] array){
quick(array,0,array.length-1);
}
private static int selectPivot(int[] array, int low, int high){
int tmp = array[low];
while (low < high){
while (low < high && array[high] >= tmp){
high--;
}
if (low =