常用排序算法-快速排序

简介

  快速排序实际上是对冒泡排序的一种改进,通过一趟排序将要排序的数组分成两部分,其中一部分的所有数据都比另一部分的所有数据都要小,然后再对这两部分数据分别进行快速排序,整个排序过程递归进行,最终使整个数组有序。

原理

  快速排序算法的原理是选择一个元素作为基准值,一般选择数组的第一个元素,将比基准值大的元素放在数组的右边,比基准值小的放置在数组的左边。具体过程如下:

  从后向前比较,找到比基准值小的元素,将基准值和当前元素交换位置。

  从前向后比较,找到比基准值大的元素,将基准值和当前元素交换位置。

  重复执行以上过程,直到从前向后比较的索引和从后向前比较的索引值相等,此时对于基准值来说,左边的数据均小于等于基准值,右边的数据均大于等于基准值。

  分别再对基准值左右两侧的数组进行快速排序,直到整个数组均有序。

程序

public class QuickSort {
    public static void sort(int[] arr){
        if(arr == null || arr.length == 0)
            throw new IllegalArgumentException("error");
        quickSort(arr, 0, arr.length-1);
    }
    public static void quickSort(int[] arr, int start, int end){
        int l = start;
        int r = end;
        int key = arr[start];
        while(l < r){
            while(l < r && arr[r] >= key)
                r--;
            if(arr[r] <= key){
                swap(arr, l, r);
            }
            while(l < r && arr[l] <= key)
                l++;
            if(arr[l] >= key){
                swap(arr, l, r);
            }
        }
        if(start < l)
            quickSort(arr, start, l-1);
        if(r < end)
            quickSort(arr, r+1, end);
    }
    private static void swap(int[] arr, int i, int j){
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

总结 

  快速排序的时间复杂度最差为O(n^2),最好情况时O(nlogn),平均时间复杂度为O(nlogn)。

  由于递归调用的缘故,快速排序空间复杂度最好情况时O(logn),最坏情况时O(n)。也有的人说快速排序空间复杂度是O(nlogn),或许是因为递归调用O(logn)*数组大小O(n)?。

  由于快速排序会交换两个不相邻的元素,所以快速排序是不稳定的。

猜你喜欢

转载自www.cnblogs.com/silentteller/p/12758059.html