快速排序( Quick Sort) 的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
快速排序实际是一种交换排序,排序方法如图1所示
第一步:将left指针指向的数字缓存到base中,right指针向左遍历。如果right指针指向的数字小于base值,则将其赋值给left指针指向的位置;
第二步:left指针向右遍历,如果left指针指向的数字大于base值,则将其赋值给right指针指向的位置;
第三步:不断重复第一,第二步,直到left指针和right指针重合。
通过一趟排序将要排序的数据分割成独立的两部分:分割点左边都是比它小的数,右边都是比它大的数。然后再对分割点左右两部分不断重复上述一、二、三步。
//快速排序
private static void quickSort(int[] a, int left, int right) {
//左下标一定要小于又下标,否则就数组越界
if (left < right) {
//对数组进行分割排序,返回分割点
int base = division( a, left, right );
//对左右两部分,分别进行递归排序
quickSort( a, left, base -1);
quickSort( a, base + 1, right );
}
}
private static int division(int[] a, int left, int right) {
//将第一个left指针设置为基准base值
int base = a[left];
//当左右指针重合时跳出循环
while (left < right) {
//如果right指针指向的值大于base,继续向左遍历
while (left < right && a[right] >= base) {
right --;
}
//直到右指针指向的值小于base值或者遍历结束(左右指针重合),
//将right指针指向的值赋值给left指针指向的位置
a[left] = a[right];
//如果left指针指向的值大于base,继续向右遍历
while (left < right && a[left] <= base) {
left ++;
}
//直到右指针指向的值小于base值或者遍历结束(左右指针重合),
//将right指针指向的值赋值给left指针指向的位置
a[right] = a[left];
}
//最后将base放置到left位置。此时left左侧都比left值小,右侧比left值大
a[left] = base;
return left;
}
public static void main(String[] args) {
int[] a = {1, 4 , 6, 0, 3, 2, 5, 9};
//调用快速排序,设置初始的left指针和right指针
quickSort( a, 0, a.length-1);
System.out.print("Quick sort:\n");
for(int i=0; i<a.length; i++) {
System.out.print(a[i] + ", ");
}
}
输出结果
Quick sort:
0, 1, 2, 3, 4, 5, 6, 9,
时间复杂度:O(nlogn)