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 快速排序性能的主要内容,如果未能解决你的问题,请参考以下文章