Java 快速排序性能

Posted

技术标签:

【中文标题】Java 快速排序性能【英文标题】:Java Quick Sort Performance 【发布时间】:2022-01-05 11:11:05 【问题描述】:

我在做排序数组问题,发现一个快速排序解决方案非常快,唯一的区别是函数 1Partition 中的两行代码。想知道为什么1Partition下面两行代码可以大大提升性能:

int mi = low+(high-low)/2;
swap(arr,high,mi);   

这是完整的源代码:

class Solution 
public void swap(int[] arr, int i, int j)
    int temp = arr[j];
    arr[j] = arr[i];
    arr[i] = temp;

public void qSort(int[] arr, int low, int high)
    if(low<high)
        int pi = lPartition(arr,low,high);
        qSort(arr,low,pi-1);
        qSort(arr,pi+1,high);
    

public Integer lPartition(int[] arr, int low, int high)
    int mi = low+(high-low)/2;
    swap(arr,high,mi);
    int pi = high;
    int i = low-1;
    for(int j=low;j<high;j++)
        if(arr[j]<arr[pi])
            i++;
            swap(arr,i,j);
        
    
    swap(arr,pi,i+1);
    return (i+1);
    

public int[] sortArray(int[] arr) 
    qSort(arr,0,arr.length-1);
    return arr;

【问题讨论】:

这两行与其他什么相反? 【参考方案1】:

我猜你是在一个类似于 leetcode 的网站上做这个问题。

如果他们的测试用例包含一个排序数组(通常他们会 ),如果不添加这两行,您的快速排序时间复杂度将退化为 o(n^2)。 (您将始终选择最大的数字为pivot)。

除了选择中值之外,您还可以选择随机值作为pivot

swap(arr,high,randomIndex in range);

我在我的电脑上做了一个简单的测试,对一个长度为 100,000 的有序数组进行排序。没有这两行代码,需要2700ms(这两行加起来只需要40ms)

【讨论】:

是的,我正在做 leetcode,非常感谢您提供的信息! 你也可以看看3-way-quicksort:link

以上是关于Java 快速排序性能的主要内容,如果未能解决你的问题,请参考以下文章

java快速排序

Java集合与数据结构 排序

Java集合与数据结构 排序

Java集合与数据结构 排序

Java集合与数据结构 排序

java双路快速排序的实现