Java 快速排序性能
Java Quick Sort Performance
我在做数组排序题,发现一种快速排序的解法非常快,唯一不同的是函数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;
}
}
我猜你是在类似leetcode的网站上做题的
如果他们的测试用例包含排序数组(通常他们会
), 如果不添加这两行,您的快速排序时间复杂度将退化为 o(n^2)。 (您将始终选择最大的数字作为 pivot
)。
除了选择中值,您还可以选择一个随机值作为 pivot
:
swap(arr,high,randomIndex in range);
我在电脑上做了一个简单的测试,对长度为100,000的有序数组进行排序。如果没有这两行代码,需要2700ms(加上这两行只需要40ms)
我在做数组排序题,发现一种快速排序的解法非常快,唯一不同的是函数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;
}
}
我猜你是在类似leetcode的网站上做题的
如果他们的测试用例包含排序数组(通常他们会
), 如果不添加这两行,您的快速排序时间复杂度将退化为 o(n^2)。 (您将始终选择最大的数字作为 pivot
)。
除了选择中值,您还可以选择一个随机值作为 pivot
:
swap(arr,high,randomIndex in range);
我在电脑上做了一个简单的测试,对长度为100,000的有序数组进行排序。如果没有这两行代码,需要2700ms(加上这两行只需要40ms)