Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不使用辅助数组的情况下优化快速排序_Java_Sorting - Fatal编程技术网

Java 如何在不使用辅助数组的情况下优化快速排序

Java 如何在不使用辅助数组的情况下优化快速排序,java,sorting,Java,Sorting,正如您所知,这是一个快速排序,我想在arrayList中对其进行优化,而不想使用其他数组或linkedList。假设数组的一半是按升序排序的,其他的都在其中。我的意思是优化是较少的代码交换,这取决于选择轴或更改分区函数的位置。如果您知道我应该如何优化它,请帮助我。如果我写为真,count变量的总数就是交换数。谢谢 public class Quick { public static void main(String[] args) { int[] a = {4,6

正如您所知,这是一个快速排序,我想在arrayList中对其进行优化,而不想使用其他数组或linkedList。假设数组的一半是按升序排序的,其他的都在其中。我的意思是优化是较少的代码交换,这取决于选择轴或更改分区函数的位置。如果您知道我应该如何优化它,请帮助我。如果我写为真,count变量的总数就是交换数。谢谢

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)。使用中间值有助于提高最坏情况下的时间复杂度,但典型情况下速度较慢。