Java排序之快速排序

快速排序

一、基本概念

首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这样就将序列分为两个子序列。这个过程称为一趟快速排序。

详细步骤:

  1. 设两个变量i,j。i指向最左边,j指向最右边
  2. 选数组第一个元素为基准点pivot,即pivot=array[0]
  3. 从后开始向前搜索,即j--,直到找到第一个array[j]<pivot,交换array[i]与array[j]
  4. 从前向后搜索,即i++,直到找到第一个array[i]>pivot,交换array[i]与array[j]
  5. 重复3、4两步,直到i==j,此时i与j重合

二、算法特点

是否稳定:false

平均时间复杂度:O(nlogn)  

最差时间复杂度:O(n^2)    (每一次总是选到最小或最大值作为基准点)

最优时间复杂度:O(nlogn)   (每次都恰好选到中间值作为基准点)

三、相关代码

方法一:

public static void quick_sortA(int[] data, int low, int high) {
        if (low >= high)
            return;

        int i = low;
        int j = high;
        int pivot = data[low];

        while (i < j) {
            while (i < j && pivot < data[j]) {// 从右开始
                j--;
            }
            if (i < j) { // 位于基准点右边且小于基准点
                data[i] = data[j];
                i++;
            }

            while (i < j && pivot > data[i]) {// 左边
                i++;
            }
            if (i < j) { // 位于基准点左边且大于基准点
                data[j] = data[i];
                j--;
            }
        }
        data[i] = pivot;
        quick_sortA(data, low, i - 1);
        quick_sortA(data, i + 1, high);
    }

方法二:

public static void quick_sortB(int[] data, int low, int high) {
        int pivot;
        if (low < high) {
            pivot = partition(data, low, high);
            quick_sortB(data, low, pivot - 1);
            quick_sortB(data, pivot + 1, high);
        }
}

public static int partition(int[] data, int low, int high) {
        int pivot = data[low];
        while (low < high) {
            while (low < high && pivot <= data[high]) {
                high--;
            }
            data[low] = data[high];

            while (low < high && pivot >= data[low]) {
                low++;
            }
            data[high] = data[low];
        }
        data[low] = pivot;
        return low;
}

测试:

public static void main(String[] args) {
        int[] a = { 2,5, 5, 3, 9, 6, 1, 4, 8,7};
        quick_sortA(a, 0, a.length - 1);        
        printArray(a);
}

public static void printArray(int[] data) {
        if (0 == data.length) {
            return;
        }

        for (int i : data) {
            System.out.print(i + " ");
        }
}

运行结果:

1 2 3 4 5 5 6 7 8 9 

 

 

 

posted @ 2012-10-17 21:56  一瓶珍情  阅读(220)  评论(0编辑  收藏  举报