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

聚集相同元素排序是快速排序的一种优化方案,它的思路是在经过一次找基准之后把数据中与基准相同的数据聚集到基准左右,这样就可以少进行几次递归找基准的过程,从而提高了运行效率。看以下程序: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)
上一篇 2022年4月11日 下午12:00
下一篇 2022年4月11日 下午12:00


相关推荐

  • 系统集成工程师被取消_软考信息系统管理工程师

    系统集成工程师被取消_软考信息系统管理工程师软考中级——系统集成项目管理工程师备考干货第二章:信息系统集成及服务管理。

    2022年10月4日
    4
  • rsyslogd -n_Syslog

    rsyslogd -n_Syslogimjournal模块提供将结构化日志消息从systemd日志导入syslog的功能。默认配置:module(load=”imjournal”#providesaccesstothesystemdjournalStateFile=”imjournal.state”)#Filetostorethepositioninthejournal有时需要禁止限速:module(load=”imjournal”Ratelimit.Interv

    2022年8月15日
    6
  • feiler包(prim算法)

    背景Weisfeiler-Lehman算法(威斯费勒-莱曼算法)是测试图同构的经典算法之一,我在这儿记录一下它的实现原理,参考文章为Weisfeiler-LehmanGraphKernels伪代码论文中的伪代码如下所示假设要测试同构的两张图为G和G`,那么在结点v的第i次迭代里,算法都分别做了四步处理:标签复合集定义、复合集排序、标签压缩和重标签。标签复合集定义如果是第一次迭代,v的标签复合集里只有一个元素,就是v的标签。如果不是第一次迭代,v的标签复合集元素就是v的..

    2022年4月10日
    65
  • 请不要拿ipad和手机、上网本相提并论「建议收藏」

    请不要拿ipad和手机、上网本相提并论「建议收藏」苹果公司最近推出了ipad,但网上的评论不是很好,我觉得,一个好的产品会改变人们对某些事物的认识,甚至是人们的生活习惯。网上有ipad的十大罪状,有些我不了解,但有我认为是无稽之谈。不支持多点触摸首先,多点触摸苹果公司在他们的产品中应用的比较多的,比如iphone和macair,当然这样的技术迁移到ipad上面肯定没有任何问题,但是,网上认为这样的技术在ipad的设计上被取消

    2026年2月24日
    4
  • JMESPath_英语语法整理

    JMESPath_英语语法整理前言JMESPath是JSON的查询语言。您可以从JSON文档中提取和转换元素官方文档:https://jmespath.org/tutorial.html基本表达式JMESPath用的最多的

    2022年7月28日
    12
  • python知识推理知识图谱_知识图谱系列–知识推理

    python知识推理知识图谱_知识图谱系列–知识推理摘要本文接着知识图谱系列–实体链接技术(1)[1]介绍知识推理方法。知识推理就是通过各种方法获取新的知识或者结论,这些知识和结论满足语义,其具体任务可分为可满足性(satisfiability)、分类(classification)、实例化(materialization)。[2]paper:Das,R.,Neelakantan,A.,Belanger,D.,&Mccal…

    2022年6月6日
    41

发表回复

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

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