经典十大算法——快速排序(java版本)

1.算法思想

通过一趟排序将要排序的数据分割成独立的两部分,

其中一部分的所有数据都比另外一部分的所有数据都要小,

然后再按此方法对这两部分数据分别进行快速排序,

整个排序过程可以递归进行,以此达到整个数据变成有序序列。

2.算法代码

public class quickSort {
    public static void main(String[] args) {
        int a[] = {8, 1, 3, 5, 2};
        quicksort(a);
        for (int k = 0; k < a.length; k++) {
            System.out.println(a[k]);
        }
    }
    public static void quicksort(int arr[]){
        //进行排序算法
        sort(arr,0,arr.length-1);
    }
    public static void sort(int arr[],int low,int high){
        if(low<high){
            //找到中间那个数
            int mid = partition(arr,low,high);
            //排序左边的
            sort(arr,low,mid-1);
            sort(arr,mid+1,high);
        }
    }

    public static int partition(int arr[],int left,int right) {
        //做基准点
        int temp = arr[left];
        while (left < right) {
            //从后向前找找比基准小的
            while (left < right && arr[right] > temp){
                    right = right-1;
            }
            //交换位置
            arr[left] = arr[right];
            //从前向后找比基准大的
            while (left < right && arr[left] < temp){
                left = left + 1;
            }
            //交换位置
            arr[right] = arr[left];
        }
        //将基准数据放到位置
        arr[left] = temp;
        //返回基准点
        return left;
    }
}

3.时间复杂度

最差情况:当数组原本就按从小到大顺序排列时:
10 20 30 40 50 60 70 80 第一轮比较,将10分别与20、30、...、80比较,共比较n-1次
第二轮比较,将20分别与30、...、80比较,共比较n-2次
....
共比较(n-1)+(n-2)+...+1次,即时间复杂度为O(n方),与冒泡排序时间复杂度一样


一般情况:时间复杂度为O(nlogn) 需要复杂的数学证明

4.参考博客

https://cloud.tencent.com/developer/article/1486381?from=15425

https://www.bilibili.com/video/BV1WF41187Bp

posted @ 2021-12-07 23:14  changfan  阅读(117)  评论(0编辑  收藏  举报