java排序---快速排序

一.简介

       在排序算法中,快速排序算是里面的佼佼者。它是对冒泡排序的一种改进,基本思想是,通过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。这里提到了分割成两部分,使我们想到了分而治之的思想,其实就是让另外两部分分别去实现之前的排序而已。因为要找出关键字,用关键字来分割两部分,所以最好的情况是这个关键字是在排序数组的中间位置。最极端的情况是这个关键字是最大值或最大值。

排序过程:


二.代码实现

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

    /**
     * 打印数组
     *
     * @param a
     */
    private static void print(int[] a) {
        for (int i = 0; i < a.length; i++) {
            System.out.print(a[i] + " ");
        }
        System.out.println();
    }

    /**
     * 快速排序
     *
     * @param a    数组
     * @param low  低位
     * @param high 高位
     */
    static void sort(int[] a, int low, int high) {
        if (low < high) {  //判断低位要小于高位
            int index = partition(a, low, high);  //找出关键字key的位置,而且大于key的都在右边,小于key都在左边
            sort(a, low, index - 1);  //左边再做快速排序
            sort(a, index + 1, high);  //右边再做快速排序
        }
    }

    /**
     * 找出关键字key的位置,而且大于key的都在右边,小于key都在左边
     *
     * @param a    数组
     * @param low  低位
     * @param high 高位
     * @return 返回关键字的位置
     */
    static int partition(int[] a, int low, int high) {
        int key = a[low];  //保存关键字,默认都去低位的值
        while (low < high) {  //低位要小于高位
            while (low < high && a[high] >= key) {  //从右往左找,如果找到数组大于关键字,高位减1
                --high;
            }
            a[low] = a[high];  //在低位小于高位的情况下,如果高位的值小于了key,将这个高位的值放到低位上面
            while (low < high && a[low] <= key) {
                ++low;
            }
            a[high] = a[low];  ////在低位小于高位的情况下,如果低位的值大于了key,将这个低位的值放到高位上面
        }
        a[low] = key;  //将关键字赋值到低位上
        return low;   //返回关键字的位置
    }
}

注释代码上面已经写的很清楚了,结果:

2 3 4 5 6 7 8 9 10 

三.总结

就平均时间而言,排序算法被认为是目前最好的一种内部排序方法。它的时间复杂度是nlog(n)。

下一篇:堆排序

猜你喜欢

转载自blog.csdn.net/u011381576/article/details/80102119