Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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/4/algorithm/10.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_Algorithm_Sorting_Quicksort - Fatal编程技术网

Java 为什么在快速排序应用程序中需要进行此排序

Java 为什么在快速排序应用程序中需要进行此排序,java,algorithm,sorting,quicksort,Java,Algorithm,Sorting,Quicksort,我试图理解quicksort应用程序中的代码,以找到第k个最小元素 下面是作者编写的代码 public class KthSmallest { public static void main(String[] args) { int[] test = {2,3,1,5,7,6,9}; System.out.println("4th smallest is " + quick_select(test, 4, 0, test.length - 1));

我试图理解quicksort应用程序中的代码,以找到第k个最小元素

下面是作者编写的代码

public class KthSmallest {
    public static void main(String[] args) {
        int[] test = {2,3,1,5,7,6,9};
        System.out.println("4th smallest is " + quick_select(test, 4, 0, test.length - 1));
    }
    private static int quick_select(int[] a, int k, int left, int right) {
         int pivot=findpivot(a,left,right);
         if(pivot==k-1){
              return a[pivot];
         }
         if(k-1<pivot){
              return quick_select(a, k, left, pivot-1);
          }
          else {
              return quick_select(a, k, pivot+1, right);
          }
        }
        private static int findpivot(int[] a, int left, int right) {
            int pivot = a[(left+right)/2];
            while(left<right){
                while(a[left]<pivot){
                    left++;
                }
                while(a[right]>pivot){
                    right--;
                }

                if(left<=right){
                    swap(a,left,right);
                    left++;
                    right--;
                }

            }
            return left;
        }

        private static void swap(int[] a, int i, int j) {
            int temp=a[i];
            a[i]=a[j];
            a[j]=temp;

        }


}
公共类KthSmallest{
公共静态void main(字符串[]args){
int[]检验={2,3,1,5,7,6,9};
System.out.println(“第四个最小值是”+quick_select(test,4,0,test.length-1));
}
私有静态int快速_选择(int[]a,int k,int left,int right){
int pivot=findpivot(a,左,右);
如果(枢轴==k-1){
返回一个[枢轴];
}

如果(k-1第一个循环向右移动
left
,直到找到大于枢轴的元素。第二个循环向右移动
right
,直到找到小于枢轴的元素。此时
a[left]
应在枢轴和
a[right]之后移动
应在枢轴之前移动,if会处理该问题

有人能用这种直觉解释为什么有必要交换吗 右>=左

right
left
是索引,而不是项目本身(这可能是您混淆的原因)。如果轴“右侧”的数字小于轴,则应将其移动到轴的左侧

分别,如果轴左侧的数字大于轴-则应将其移动到轴的右侧


一旦我们遇到两个这样的项目,我们就使用
if
条件来确保我们没有“走得太远”在前面的循环中,找到的数字真的应该交换,这个检查测试索引
left它实际上不是重复的,因为另一个循环中的代码甚至不起作用,如果假设,left>right?如果left>right,这意味着我们在前面的
迭代中走得太远了我们实际上已经完成了排序(因此,
if
将不会执行,我们将退出外部wihle循环,因为条件
left我不能从左到右,从右到右,从左到右,从右到右,从左到右,从左到右,从左到右,从左到右,从左到右,从左到右,从左到右,从左到右到右,从左到右,从左到右,从左到右,从左到右到右,从左到右,从左到右到右,从左到右,从右到右,从(left==right)
您不需要交换,因为它是同一项…如果right>left,这意味着它们没有交叉。右侧的所有元素都大于pivot。左侧的所有元素都小于pivot。从这一点,您能解释为什么需要交换吗?“右侧的所有元素都大于轴。左侧的所有元素都小于轴。”没错!但此条件与右侧索引上的项目有关(而不是与“右侧索引右侧”的项目有关),左侧的情况也一样(。
     if(left<=right){
                    swap(a,left,right);
                    left++;
                    right--;
        }