Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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 快速排序可删除某些条件 publicstaticvoidquicksort(整数[]arr,int-low,int-high) { //检查空数组或空数组 如果(arr==null | | arr.length==0){ 返回; } 如果(低>=高){ 返回; } //从列表中间获取pivot元素 int middle=低+(高-低)/2; int pivot=arr[中间]; //使左枢轴 int i=低,j=高; 而(我) { j--; } //现在比较列表两侧的值,看看它们是否需要交换 //交换后,在两个列表上移动迭代器 //第(1)号 如果(i){ 快速排序(arr、i、高); } }_Java_Algorithm_Quicksort - Fatal编程技术网

Java 快速排序可删除某些条件 publicstaticvoidquicksort(整数[]arr,int-low,int-high) { //检查空数组或空数组 如果(arr==null | | arr.length==0){ 返回; } 如果(低>=高){ 返回; } //从列表中间获取pivot元素 int middle=低+(高-低)/2; int pivot=arr[中间]; //使左枢轴 int i=低,j=高; 而(我) { j--; } //现在比较列表两侧的值,看看它们是否需要交换 //交换后,在两个列表上移动迭代器 //第(1)号 如果(i){ 快速排序(arr、i、高); } }

Java 快速排序可删除某些条件 publicstaticvoidquicksort(整数[]arr,int-low,int-high) { //检查空数组或空数组 如果(arr==null | | arr.length==0){ 返回; } 如果(低>=高){ 返回; } //从列表中间获取pivot元素 int middle=低+(高-低)/2; int pivot=arr[中间]; //使左枢轴 int i=低,j=高; 而(我) { j--; } //现在比较列表两侧的值,看看它们是否需要交换 //交换后,在两个列表上移动迭代器 //第(1)号 如果(i){ 快速排序(arr、i、高); } },java,algorithm,quicksort,Java,Algorithm,Quicksort,我是快速排序算法的初学者。有人能告诉我,在上面的快速排序算法中,条件if number(1)、if number(2)和if number(3)的用途是什么吗 对于数字(1),我觉得这个条件是不必要的,因为我肯定会小于或等于j,因此交换应该只执行 对于数字(2)和数字(3),其解释类似。如果我错了,请纠正我,谢谢第1个-前两个for循环只需检查要交换的右元素(从左侧和右侧),因此当计算i和j索引位置时,此条件查看它们是否处于需要交换的位置(因为隐含的一个大于另一个) 数字2和3-这是“分治算法”

我是快速排序算法的初学者。有人能告诉我,在上面的快速排序算法中,条件if number(1)、if number(2)和if number(3)的用途是什么吗

对于数字(1),我觉得这个条件是不必要的,因为我肯定会小于或等于j,因此交换应该只执行


对于数字(2)和数字(3),其解释类似。如果我错了,请纠正我,谢谢第1个-前两个
for
循环只需检查要交换的右元素(从左侧和右侧),因此当计算
i
j
索引位置时,此条件查看它们是否处于需要交换的位置(因为隐含的一个大于另一个)

数字2和3-这是“分治算法”的一部分,这部分只是将阵列分成两个较小的部分


看一看(来源)

你能给我一个无序数组元素的样本来证明我可以大于j,它错误地执行了交换,这样我就可以可视化了。感谢你,事实上,正如目前所写的那样,
我理解分而治之的方法。但是,我觉得我总是小于j,小于j,小于j,大于i。因此或者,没有必要提出这些条件。如果可能,请给我一个反例来反驳这一点。谢谢,对不起,这不是正确的方法。我建议你一步一步地调试这段代码并研究算法,有大量的文档、帖子和视频详细解释了这一点。快速排序中的pivot思想是一个突破通过这一点,让这个算法比其他算法更好。
public static void quickSort(Integer[] arr, int low, int high) 
    {
        //check for empty or null array
        if (arr == null || arr.length == 0){
            return;
        }

        if (low >= high){
            return;
        }

        //Get the pivot element from the middle of the list
        int middle = low + (high - low) / 2;
        int pivot = arr[middle];

        // make left < pivot and right > pivot
        int i = low, j = high;
        while (i <= j) 
        {
            //Check until all values on left side array are lower than pivot
            while (arr[i] < pivot) 
            {
                i++;
            }
            //Check until all values on left side array are greater than pivot
            while (arr[j] > pivot) 
            {
                j--;
            }
            //Now compare values from both side of lists to see if they need swapping 
            //After swapping move the iterator on both lists
            //NUMBER (1)
            if (i <= j) 
            {
                swap (arr, i, j);
                i++;
                j--;
            }
        }
        //Do same operation as above recursively to sort two sub arrays
        //NUMBER (2)  
        if (low < j){
            quickSort(arr, low, j);
        }
        //NUMBER (3)
        if (high > i){
            quickSort(arr, i, high);
        }
    }