首页 > 其他分享 >数组元素排序(二)

数组元素排序(二)

时间:2023-04-15 13:33:27浏览次数:38  
标签:arr int 元素 算法 数组 排序 data left

快速排序(Quick Sort)由图灵奖获得者Tony Hoare发明,被列为20世纪十大算法之一,是迄今为止所有内排序算法中速度最快的一种,快速排序的时间复杂度为O(nlog(n))。

快速排序通常明显比同为O(nlogn)的其他算法更快,因此常被采用,而且快排采用了分治法的思想,所以在很多笔试面试中能经常看到快排的影子。

排序思想:

  1. 从数列中挑出一个元素,称为"基准"(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  4. 递归的最底部情形,是数列的大小是零或一,也就是永远都已经被排序好了。虽然一直递归下去,但是这个算法总会结束,因为在每次的迭代(iteration)中,它至少会把一个元素摆到它最后的位置去。

第一轮操作:

 第二轮操作

内部排序性能比较与选择

性能比较:

           从平均时间而言:快速排序最佳。但在最坏情况下时间性能不如堆排序和归并排序。

           从算法简单性看:由于直接选择排序、直接插入排序和冒泡排序的算法比较简单,将其认为是简单算法。对于Shell排序、堆排序、快速排序和归并排序算法,其算法比较复杂,认为是复杂排序。

           从稳定性看:直接插入排序、冒泡排序和归并排序时稳定的;而直接选择排序、快速排序、 Shell排序和堆排序是不稳定排序

           从待排序的记录数n的大小看,n较小时,宜采用简单排序;而n较大时宜采用改进排序。

选择:

           若n较小(如n≤50),可采用直接插入或直接选择排序。 当记录规模较小时,直接插入排序较好;否则因为直接选择移动的记录数少于直接插入,应选直接选择排序为宜。

           若文件初始状态基本有序(指正序),则应选用直接插入、冒泡或随机的快速排序为宜;

           若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。

快排示例

   public static void main(String[] args) {
        int[] data = {9, -16, 30, 23, -30, -49, 25, 21, 30};
        System.out.println("排序之前:\n" + Arrays.toString(data));
        quickSort(data, 0, data.length - 1);
        System.out.println("排序之后:\n" + Arrays.toString(data));
    }

    public static void quickSort(int[] arr, int left, int right) {
        if (right >= left) {
            //基数
            int basic = arr[left];
            //定义指针
            int i = left;
            int j = right;

            while (i < j) {//左大
                while (i < j && arr[j] > basic) {
                    j--;
                }
                if (i < j) {
                    arr[i] = arr[j];
                    i++;
                }
                while (i < j && arr[i] < basic) {
                    arr[j] = arr[i];
                    i++;
                }
                if (i < j) {
                    arr[j] = arr[i];
                    j--;
                }
            }
            arr[i] = basic;
            quickSort(arr, left, i - 1);
            quickSort(arr, i + 1, right);
        }
    }

标签:arr,int,元素,算法,数组,排序,data,left
From: https://www.cnblogs.com/wdh01/p/17213147.html

相关文章

  • JAVA 循环删除list中元素的方法总结
    摘要:介绍List集合实现元素边遍历边删除的方法,例如removeIf和迭代器iterator.remove()等。综述  List集合是我们开发中经常使用到的一种集合形式,有时候会遇到在遍历List集合时需要删除指定的元素。但在根据条件使用for循环或者增强的for循环遍历删除某些元素时却不能随心所欲地......
  • Java 把列表元素拼接字符串
    摘要:使用JavaCollectors.joining方法把列表中的所有元素通过指定的分隔符连接字符串。目录综述使用For循环StringUtils.join函数Collectors.joining(Function)函数GuavaJoinerjoin函数String.join函数结束语综述  在项目开发中,经常遇到的一个问题就是要把得到的一个......
  • json数据按照某一个相同键值进行分类成一个新的二维json数组
    1formatTreeData(checkNodes){2varmap={},3targetData=[];4checkNodes.forEach(item=>{5if(!map[item.groupKey]){6targetData.push({7value:item.groupKey,8label......
  • 删除无效的括号(广度优先搜索、字符串)、计算右侧小于当前元素的个数(树状数组、线段
    删除无效的括号(广度优先搜索、字符串)给你一个由若干括号和字母组成的字符串s,删除最小数量的无效括号,使得输入的字符串有效。返回所有可能的结果。答案可以按任意顺序返回。示例1:输入:s="()())()"输出:["(())()","()()()"]示例2:输入:s="(a)())()"输出:["(a())()","(......
  • 排序复杂度
    常见的排序算法中,效率高到低的排名如下:1.快速排序(QuickSort):时间复杂度平均情况下为O(nlogn),是最快的排序算法之一。2.归并排序(MergeSort):时间复杂度稳定为O(nlogn),但需要消耗额外的内存空间。3.堆排序(HeapSort):时间复杂度为O(nlogn),实现简单,不需要额外的内存空间。4.希......
  • js中的数组方法
    js中数组方法大全平常在写代码的时候,我们经常会用到数组这个类型,那么数组到底有多少方法,方法各自的作用又是什么呢?1.toString作用:把数组转换为数组值(逗号分隔)的字符串。示例:Array.toString()2.join作用:将所有数组元素结合为一个字符串。区别与toString,join可以规定分......
  • leetcode:排序数组
    题目描述给你一个整数数组 nums,请你将该数组升序排列。示例1:输入:nums=[5,2,3,1]输出:[1,2,3,5]示例2:输入:nums=[5,1,1,2,0,0]输出:[0,0,1,1,2,5]题目地址:912.排序数组解题思路 这道题目直接告诉你了要排序,关键是选中什么样的排序算法?题目的限制条件是有两个,第......
  • 环形链表_相交链表_多数元素(java语言)
    环形链表力扣141题问题:思路:创建hashset,把链表的每个节点放到集合中,在放入的过程中检查这个节点是否已经存在,存在则证明存在环。代码实现:publicclassSolution{publicbooleanhasCycle(ListNodehead){Set<ListNode>set=newHashSet<>();whi......
  • 【剑指 Offer】 66. 构建乘积数组
    【题目】给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B[i]的值是数组A中除了下标i以外的元素的积,即B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入:[1,2,3,4,5]输出:[120,60,40,30,24]来源:力扣(LeetCode)链接:https://leetc......
  • 导入 Microsoft Dynamics 365 解决方案时发生 LocalizedNames 错误,元素 savedquery 的
    尝试在Dynamics365中导入解决方案时,会收到以下错误:“无法导入此解决方案包,因为它包含无效的XML。可以尝试使用架构验证错误中找到的信息手动编辑XML内容来修复文件,也可以联系解决方案提供商。错误代码8004801a。如果选择“技术详细信息”,则会看到以下消息以及其他......