排序算法之快速排序

前言

快速排序,仅仅听到这个名字,就觉得它和其他的排序算法非同一般了。的确,快速排序是一个非常效率的排序算法,如果说冒泡排序的时间复杂度为O(n),那么快速排序的时间复杂度就是O(logn)。
其实快速排序是对冒泡排序的一种改进。
冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换距离很大,因此总的比较次数和交换次数少了很多,速度也快了不少。
它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据比另一部分的所有数据要小,再按这种方法对这两部分数据分别进行快速排序,整个排序过程可以用递归进行,使整个数据变成有序序列。

原理

这是典型的分治思想。

在待排序的数列中,我们首先要找到一个数字作为基准数。为了方便,我们一般选择第一个数来作为比较的基准数。接下来我们需要把这个待排序的数列中小于这个基准数的元素移动到待排序序列的左边,把大于基准数的元素移动到待排序数列的右边。这个时候,这个数列就相对的有序了;接着把两个分区的元素再按照上面的方法,对每个分区找出基准数,然后移动,直到每个分区只有一个数为止,这样这个数列就变成有序的数列了。

实现

public class QuickSort {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[] { 47, 29, 71, 99, 78, 19, 24, 47 };
        quickSort(a, 0, a.length - 1);
        System.out.println(Arrays.toString(a));
    }

    private static void quickSort(int[] a, int begin, int end) {
        //
        int tbegin = begin, tend = end;
        // 将第一个值作为快排序的分界值
        int pivot = a[begin];
        while (tbegin < tend) {
            // 如果两个游标没有交集,或者后面一直大于或等于分界值就一直向前移动
            while (tbegin < tend && a[tend] >= pivot) {
                --tend;
            }
            a[tbegin] = a[tend];
            // 如果两个游标没有交集,或者前面是小于或等于分界值,就一直向后头移动
            while (tbegin < tend && a[tbegin] <= pivot) {
                ++tbegin;
            }
            a[tend] = a[tbegin];

        }
        // 将临界值赋值给游标的交集的地方
        a[tbegin] = pivot;
        if (begin < tend) {
            // 递归排序游标的左边
            quickSort(a, begin, tend - 1);
        }
        if (tbegin < end) {
            // 递归排序游标的右边
            quickSort(a, tbegin + 1, end);
        }

    }

}
[19, 24, 29, 47, 47, 71, 78, 99]

总结

快速排序的实现思想与方法:分治+递归。

猜你喜欢

转载自blog.csdn.net/qq_33764491/article/details/79793730