1?何为快排,
快排遇到到思想也是分治思想,和归并排序是同意思想,单逻辑完全不同,
快排的思想是这样的,如果要排序的数组下标是从p到r,那我们选择p到r之间的任意一个数据作为分区点(pivot),遍历分区点左边的数据和分区点右边的数据,将比分区点小的数据放在分区点的左边,大于分区点的数据放在分区点的右边,这样的数据就被分为了3部分,,
根据分治的思想,我们可以用递归代码实现快速排序的实现逻辑,
public class QuickSort{
public static void main(String[] args) {
int[] num = {3,45,78,64,52,11,64,55,99,11,18};
quickSort(num,0,num.length-1);
}
public static void quickSort(int[] num,int left,int right){
if(left==right) return;
//取基准值provit
int key = num[left];//左边元素为分区值
int i = left;
int j = right;
while(i<j){
while(num[j] >= key && i<j){//j向左移动,直到遇到比key小的值,
j--;
}
while(num[i] <= key&& i<j){//i向由移动,知道找到比key大的值
i++;
}
//i和j指向的元素进行交换
if(i<j){
int temp = num[i];
int[j] = num[i];
num[i] = num[j];
}
}
num[left]=num[i];
num[i] = key;
count ++;
quickSort(num,left,i-1);
quickSort(num,i+1,right);
}
}
总结:由于上图可知,数据需要进行分区和交换,根据实现代码的编写,此种实现方式是原地排序,
比如进行排序6,8,7,5,6,3,5,9,第一次分区之后,2个6的原有的前后位置发生变化,所以快排不是稳定排序.
通常情况下快排序的时间复杂度是nlogn,但是我们看一个极端的例子1,2,3,4,5,我们取最后一个数据最为分区点,每次分区,2个区间的数据都是不均等的,我们大约需要进行n次分区,在这种极端的情况下,快排的时间复杂度由nlogn变为n^2。