快排的优化方法(优化营商环境方案)

聚集相同元素排序是快速排序的一种优化方案,它的思路是在经过一次找基准之后把数据中与基准相同的数据聚集到基准左右,这样就可以少进行几次递归找基准的过程,从而提高了运行效率。看以下程序:importjava.util.Arrays;publicclassFocusAlikeQuickSort{/**找基准的方法,与前文相同*/publicstatic…

大家好,又见面了,我是你们的朋友全栈君。

先来复习下找基准的方法:

public static int partion(int[] arr, int start, int end) { int tmp = arr[start];

        while (start < end) { while (arr[end] >= tmp && start < end) { --end;
            }

            if (start >= end) { break;
            }else {
                arr[start] = arr[end];
            }

            while (start < end && arr[start] <= tmp) { ++start;
            }

            if (start >= end) { break;
            }else {
                arr[end] = arr[start];
            }
        }

        arr[start] = tmp;
        return start;
    }

后面所有的优化程序都采用该方法来找基准。



一、聚集相同元素法

聚集相同元素排序是快速排序的一种优化方案,它的思路是在经过一次找基准之后把数据中与基准相同的数据聚集到基准左右,这样就可以少进行几次递归找基准的过程,从而提高了运行效率。
看以下程序:

public class FocusAlikeQuickSort { 
   

    /** 聚集相同元素 */
    public static int[] focusNum(int[] arr, int start, int end, int par) {
        int parLeft = par - 1;
        int parRight = par + 1;
        // 寻找并聚集基准左边与基准相同的元素
        for (int i = par - 1; i >= start; i--) {
            if (arr[i] == arr[par]) {
                if (i != parLeft) {
                    // 依次遍历比较,相同就交换位置
                    int tmp = arr[parLeft];
                    arr[parLeft] = arr[i];
                    arr[i] = tmp;
                    parLeft--;  
                }else {
                    parLeft--;
                }
            }
        }
        // 寻找并聚集基准右边与基准相同的元素
        for (int j = par + 1; j <= end; j++) {
            if (arr[j] == arr[par]) {
                if (j != parRight) {
                    // 依次遍历比较,相同就交换位置
                    int tmp = arr[parRight];
                    arr[parRight] = arr[j];
                    arr[j] = tmp;
                    parRight++;
                }else {
                    parRight++;
                }
            }
        }
        // 以数组的形式返回聚集相同元素之后的未有序数据的边界
        int[] array = new int[2];
        array[0] = parLeft;
        array[1] = parRight;
        return array;
    }

    public static void quickSort(int[] arr, int start, int end) {
        int par = partion(arr, start, end);
        // 聚集相同元素
        int[] array = focusNum(arr, start, end, par);
        int left = array[0];
        int right = array[1];

        if (par > start + 1) {
            quickSort (arr, start, left);
        }

        if (par < end - 1) {
            quickSort (arr, right, end);
        }
    }
}

运行过程是这样的:
这里写图片描述



二、随机取基准法

随机取基准法是快速排序的另一种优化方案,它是通过产生随机数的方式在数据中随机选取一个数据来进行找基准操作,次方法较快排在效率上有一定的提高。
看程序:

public class RandomQuickSort {
    public static void swap(int [] arr, int start, int end) {

        int tmp = arr[start];
        arr[start] = arr[end];
        arr[end] = tmp;
    }

    public static void quickSort(int[] arr, int start, int end) {
        // 产生在[start, end]之间的随机数
        Random rand = new Random();
        int randNum = rand.nextInt(end - start + 1) + start;
        // 将随机数交换到start位置
        swap(arr, start, randNum);

        int par = partion(arr, start, end);

        if (par > start + 1) {
            quickSort (arr, start, par - 1);
        }

        if (par < end - 1) {
            quickSort (arr, par + 1, end);
        }
    }
}


三、三分取基准法

此方法也是快速排序的一种优化方案,它的思路是比较数据中start,end以及两者中间位置的数据的大小,将这三个值中处于中间位置的值放到首位,再进行找基准操作,此方法较之快排在效率上也有一定的提高。
看程序:

public class ThirdPartitionQuickSort { 
   
    /** 交换方法 */
    public static void swap(int [] arr, int start, int end) {
        int tmp = arr[start];
        arr[start] = arr[end];
        arr[end] = tmp;
    }
    /** 比较结束后开始值,中间值和结尾值有序 */
    public static void SelectPivotMedianOfThree(int arr[], int low, int high){  
        int mid = low + ((high - low) >> 1);
        // 确定中间值小于结尾值
        if (arr[mid] > arr[high]) {  
            swap(arr, mid, high);  
        }  
        // 确定开始值小于结尾值
        if (arr[low] > arr[high]) {  
            swap(arr, low, high);  
        }  
        // 确定开始值大于中间值
        if (arr[mid] > arr[low]) {  
            swap(arr, mid, low);  
        }
    }  

    public static void quickSort(int[] arr, int start, int end) {
        // 三分确定首位
        SelectPivotMedianOfThree(arr, start, end);

        int par = partion(arr, start, end);

        if (par > start + 1) {
            quickSort (arr, start, par - 1);
        }

        if (par < end - 1) {
            quickSort (arr, par + 1, end);
        }
    }
}


以上三种方式以及上文末尾提到的优化方法往往结合使用,这样优化后的效率才能有明显的提高。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/128005.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql:Windows修改MySQL数据库密码(修改或忘记密码)

    mysql:Windows修改MySQL数据库密码(修改或忘记密码)今天练习远程访问数据库时,为了方便访问,就想着把数据库密码改为统一的,以后我们也会经常遇到MySQL需要修改密码的情况,比如密码太简单、忘记密码等等。在这里我就借鉴其他人的方法总结几种修改MySQL密码的方法。我就以实际操作修改root密码为例,操作系统为windows这里我们需要注意的是,修改MySQL是需要MySQL中的root权限,一般用户是无法更改的,除非请求管理员。修改密码的三种简…

    2022年5月10日
    33
  • DSP开发,使用CCS软件建立工程以及烧录

    DSP开发,使用CCS软件建立工程1概述1.1资源概述2工程建立步骤1概述实验的代码已经上传。1.1资源概述开发板:普中DSP开发板CCS版本:6.1.3主控芯片型号:TMS320F283352工程建立步骤1,在需要建立的工程的文件夹内新建一个工程文件夹。2,打开CCS软件,在弹出的Workspace内指向刚才建立的文件夹。3,建立新工程4,填入工程的相关信息5,新建后的工程,只包含两个文件以及一个文件夹,系统必须的头文件,RAM连接的配置文件6,在工程文件

    2022年4月6日
    676
  • matlab多重比较lsd法,多重比较法-LSD I 附赠统计学最全思维导图~[通俗易懂]

    matlab多重比较lsd法,多重比较法-LSD I 附赠统计学最全思维导图~[通俗易懂]原标题:多重比较法-LSDI附赠统计学最全思维导图~文末附赠统计学最全干货导图~前面我们讲了方差分析,方差分析主要是用于多组均值比较的,方差分析的结果是多组均值之间是否有显著性差异,但是这个显著性差异是整体的显著性差异,可是我们并不知道具体是哪些组之间有显著性差异。所以就有了我们今天的多重比较,目的就是为了获取具体哪些组之间有显著差异。多重比较法方法有很多种,这篇主要介绍一下比较常用的一种LS…

    2022年6月5日
    25
  • 马拉车算法详解, C++代码实现

    马拉车算法详解, C++代码实现算法介绍马拉车算法是用来在一个字符串中寻找最长回文串 正着读和反着读都相同的字符串 的一种算法 该算法运用了动态规划的思想 将寻找最长回文串算法的时间复杂度降低到了线性 算法原理对于一个字符串要判断它是否为回文串要分为字符串长度为奇数或者偶数两种情况 为了简化做法 我们进行如下的操作 在字符串的两端和每两个字符中间添加一个 或者任意一个一定不会在字符串中出现的字符 通常就是 啦 再在字符串的开始和结尾放置字符串开始和结束的标识符 上述操作后拓展出来的字符串的长度一定是奇数

    2025年6月6日
    0
  • pygame的安装

    pygame的安装默认python和pip已经安装好了1、去官网下载pygame我使用的是py3.8,所以选择cp38。里面包括ios、linux和windows,注意选择64/32位。2、将pygame复制到项目所在的文件夹中,如图:3、单击选中include文件夹,按住shift键,右键点击空白处,点击:在此处打开WindowPowerShell。4、输入:pipinstallpygame-2.0.1-cp38-cp38-win_amd64.whl,加粗部分为下载的文件名。我是提前已经下好了所以会

    2022年5月23日
    54
  • harbor搭建详解(仓库阁楼搭建效果图)

    一、Harbor介绍Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的DockerRegistry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能二、环境准备Harbo…

    2022年4月18日
    48

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号