快速排序

快速排序( Quick Sort) 的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。

快速排序实际是一种交换排序,排序方法如图1所示


图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
输出结果

Quick sort:
0, 1, 2, 3, 4, 5, 6, 9,

时间复杂度:O(nlogn)

你可能感兴趣的:(快速排序)