Java 如何在不使用辅助数组的情况下优化快速排序
正如您所知,这是一个快速排序,我想在arrayList中对其进行优化,而不想使用其他数组或linkedList。假设数组的一半是按升序排序的,其他的都在其中。我的意思是优化是较少的代码交换,这取决于选择轴或更改分区函数的位置。如果您知道我应该如何优化它,请帮助我。如果我写为真,count变量的总数就是交换数。谢谢Java 如何在不使用辅助数组的情况下优化快速排序,java,sorting,Java,Sorting,正如您所知,这是一个快速排序,我想在arrayList中对其进行优化,而不想使用其他数组或linkedList。假设数组的一半是按升序排序的,其他的都在其中。我的意思是优化是较少的代码交换,这取决于选择轴或更改分区函数的位置。如果您知道我应该如何优化它,请帮助我。如果我写为真,count变量的总数就是交换数。谢谢 public class Quick { public static void main(String[] args) { int[] a = {4,6
public class Quick {
public static void main(String[] args) {
int[] a = {4,6,0,7,1,12,2,18,4,9,4,13,5,6};
sort(a,0,a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
static void sort(int[] a, int lo, int hi){
if(lo < hi){
int j = partiton(a ,lo ,hi);
sort(a, lo ,j - 1);
sort(a, j + 1, hi);
}
}
static int partiton(int[] a, int lo, int hi){
int i = lo; int j = hi + 1;
int v = a[lo];
int count = 0;
while(true){
while(a[++i] < v){
if (i == hi)
break;
}
while(v < a[--j]){
if (j == lo)
break;
}
if (i >= j){
break;
}
swap(a, i, j);
count = count + 1;
}
swap(a, lo, j);
count = count + 1;
System.out.println("swap : " + count);
return j;
}
static void swap(int[] a, int i, int j){
int temp = 0;
temp = a[j];
a[j] = a[i];
a[i] = temp;
}
}
公共类快速{
公共静态void main(字符串[]args){
int[]a={4,6,0,7,1,12,2,18,4,9,4,13,5,6};
排序(a,0,a.长度-1);
for(int i=0;i=j){
打破
}
互换(a、i、j);
计数=计数+1;
}
互换(a、lo、j);
计数=计数+1;
系统输出打印项次(“交换:+计数);
返回j;
}
静态无效交换(int[]a,int i,int j){
内部温度=0;
温度=a[j];
a[j]=a[i];
a[i]=温度;
}
}
您要做的是快速排序到位,请检查以下答案:快速排序通常到位,不使用辅助数组,但它确实使用堆栈空间,O(n)最坏情况或O(log(n)),只对较小的分区使用递归,对较大的分区使用循环。有些排序的数据的问题是选择一个轴,我不知道有什么优化算法。使用中位数3有帮助,但最坏情况下的时间复杂度仍然是O(n^2)。使用中间值有助于提高最坏情况下的时间复杂度,但典型情况下速度较慢。