• 快速排序(Quicksort)算法


    基本思想

    通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。(从后往前找小的往前放,然后从前往后找大的往后放,交替进行,直到 i == j )

    特征

    快排在完全无序的情况下效果最好,时间复杂度为O(nlogn),在有序情况下效果最差,时间复杂度为O(n^2)

    算法步骤(双边循环快排):

    1. 设置两个变量i、j,排序开始的时候:i=0,j=N-1;
    2. 以第一个数组元素作为关键数据,赋值给key,即key=A[0];
    3. 从j开始向前搜索,即由后开始向前搜索(j–),找到第一个小于key的值A[j],将A[j]和A[i]的值交换;
    4. 从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[i]和A[j]的值交换;
    5. 重复第3、4步,直到i == j; (3,4步中,没找到符合条件的值,即3中A[j]不小于key,4中A[i]不大于key的时候改变j、i的值,使得j=j-1,i=i+1,直至找到为止。找到符合条件的值,进行交换的时候i, j指针位置不变。另外,i==j这一过程一定正好是i+或j-完成的时候,此时令循环结束)。

    实现代码

    /**
     * @author pzz
     * @date 2022/8/24
     * 快速排序(双边循环排序)
     */
    public class QuickSort {
        public static void main(String[] args) {
            int[] a = {5, 3, 7, 2, 9, 8, 1, 4};
            System.out.println(Arrays.toString(a));
            quick(a, 0, a.length - 1);
        }
    
        private static void quick(int[] a, int l, int r){
            //当左指针大于等于右指针时结束循环
            if(l >= r){
                return;
            }
            int p = partition(a,l,r);
            //左边区域
            quick(a,l,p - 1);
            //右边区域
            quick(a,p + 1,r);
        }
    
        //遍历区域内的元素
        private static int partition(int[] a, int l, int r){
            //每个区域的第一个元素为【基准点元素】
            int pv = a[l];
            int i = l;
            int j = r;
            while (i < j){
                //j 从右往左找小的
                while(i < j && a[j] > pv){
                    j--;
                }
                //i 从左往右找大的
                while(i < j && a[i] <= pv){
                    i++;
                }
                //交换元素
                swap(a, i, j);
            }
            //将基准点元素与J点的元素进行交换
            swap(a, l, j);
            System.out.println(Arrays.toString(a) + " j=" + j);
            return j;
        }
    
        public static void swap(int[] a,int n,int m){
            int temp = a[n];
            a[n] = a[m];
            a[m] = temp;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    结束!!!


    									你有没有为将来打算过呢?
    
    • 1
  • 相关阅读:
    Kafka 面试套路居然这样多!读完大神的 Kafka 核心手册,秒杀面试官!全网最强!!
    云原生|kubernetes|静态pod和静态pod的应用
    [附源码]Python计算机毕业设计Django人事系统
    java毕业设计超市网站mybatis+源码+调试部署+系统+数据库+lw
    flink-sql所有数据类型
    C++-Cmake指令:add_executable
    软件工程理论与实践 (吕云翔) 第五章 面向对象方法与UML课后习题及其答案解析
    小程序商城的运营推广技巧(二)
    计算机毕设(附源码)JAVA-SSM基于JAVA的校园电车租赁系统
    [附源码]SSM计算机毕业设计学生档案管理系统JAVA
  • 原文地址:https://blog.csdn.net/weixin_49107940/article/details/126511285