算法复习:快速排序

快速排序的基本思想是
在待排序的n个记录中任取一个记录作为基准点,基准点一般选第1个记录。数据区间被此基准点
划分为两个部分,所有比该基准点小的数据都排在它前半部分,所有比该基准点大的数据都排在它右半部分,并
把该基准点排在这两部分中间(成为记录归位)。这个过程成为一趟快速排序。然后对基准点左,右两个部分分别重复上述
操作,直到每部分只有一个记录为止。

这个思想再简而言之就是:每趟排序使表中的某一个元素(基于某种标准算出的基准点)放入到适当的位置,将表一分为二,
对于子表按递归方式继续这种划分,直至划分的子表长度为1.

下面的这段动画演示了{3,6,5,9,7,1,8,2,4}这组数据快速排序的全过程:

quicksort

 

代码实现(Java)如下:

public class QuickSort {
    public static int[] quickSort(int[] arr, int start, int end) {

        if (start < end) { // 确保区间内有一个以上元素
            // 设定一个基准值,这个基准值的选择其实也可以好好考究,为了突出快排的核心算法,就选择区间的第一个数
            int temp = arr[start];
            int i = start;
            int j = end;
            while (i < j) {
                while (i < j && arr[j] >= temp) {// 从区间两端交替向中间扫描,直到i==j为止
                    j--; // 从右到左扫描比基准值小的数
                }
                arr[i] = arr[j];// 将比基准值小的数移到左端

                while (i < j && arr[i] <= temp) {
                    i++;// 从左到右扫描比基准值大的数

                }
                arr[j] = arr[i];// 将比基准值大的数移到右端

            }

           arr[i] = temp;// 记录归位
            quickSort(arr, start, i - 1);// 对基准点的左半部分进行排序
            quickSort(arr, i + 1, end);// 对基准点的右半部分进行排序

        }
        return arr;

    }

    public static void main(String[] args) {
        int[] arr = { 2, 1, 3, 7, 8, 6, 5, 9, 4 };
        int[] arr1 = quickSort(arr, 0, arr.length - 1);
        for (int i = 0; i < arr1.length; i++) {
            System.out.println(arr1[i]);
        }
    }
}
posted @ 2009-12-11 16:09  Chris Wang  阅读(1197)  评论(0编辑  收藏  举报