目录
算法思想
当所有数的左边的数据都小于等于这个数,右边的数据都大于这个数时,数组就有序了。
单向扫描分区法
- 一般将数组第一个元素看作分界的数,这个数称为主元。有两个索引,分别为left和right,初始化为一头一尾
- left向右扫描,当扫描到大于主元的数时,right向左扫描,当扫描到小于等于主元的数时,left和right位置上的数据交换
- 继续步骤二,直到left>right,这时候right指向的是最后一个小于等于主元的数,交换首元与right上的数据
- 继续将right左右的两个数组进行快速排序
- 32分16,16分8,8分4,4分2,2分1,当左右两边数组的长度为0时,这个数组就已经排好序了
代码实现(Java)
private static void sort(int[] array, int start, int bigger) {
if(array == null || array.length == 0) return;
//初始化左右指针
int left = start + 1;
int right = bigger;
//设置返回条件
if(left > right) return;
//设置主元
int num = array[start];
//当left上的数大于主元,right上的数小于主元时,交换两数。
while(left <= right) {
while(left <= right && num >= array[left]) left++;
while(left <= right && num < array[right]) right--;
if(left < right)
swap(array, left, right);
}
//交换首元与right上的数
swap(array, start, right);
//继续将right两边的数组进行快速排序
sort(array, start, right-1);
sort(array, right+1, bigger);
}
private static void swap(int[] array, int sc, int r) {
int num = array[sc];
array[sc] = array[r];
array[r] = num;
}
时间复杂度
每次处理数组的一半,一共要处理次,每次处理要扫描
个数据,所以时间复杂度为