Java 为什么在快速排序应用程序中需要进行此排序
我试图理解quicksort应用程序中的代码,以找到第k个最小元素 下面是作者编写的代码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));
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--;
}