Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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_Arrays_Sorting_Selection Sort - Fatal编程技术网

Java 为什么此算法不能正确排序最后一个索引?

Java 为什么此算法不能正确排序最后一个索引?,java,arrays,sorting,selection-sort,Java,Arrays,Sorting,Selection Sort,我应该编写一个版本的选择排序算法,将最小的数字移动到数组的前面,同时将最大的数字移动到数组的末尾。我知道它基本上是从两端工作的,所以有两个排序的子数组,但是我的代码似乎把数组中的最后一个数字放错了位置。我的代码: public static void dualSelectionSort(int[]a) { for(int i=0; i<a.length-1;i++) { int min=i; int max=(a.length-1)-i;

我应该编写一个版本的选择排序算法,将最小的数字移动到数组的前面,同时将最大的数字移动到数组的末尾。我知道它基本上是从两端工作的,所以有两个排序的子数组,但是我的代码似乎把数组中的最后一个数字放错了位置。我的代码:

public static void dualSelectionSort(int[]a) {
    for(int i=0; i<a.length-1;i++) {
        int min=i;
        int max=(a.length-1)-i;
        for (int j=i+1;j<a.length-i;j++) {
            if(a[j]<a[min]) {
                min=j;
            }
            if(a[j]>a[max]) {
                max=j;
            }
        }
        int temp1=a[min];
        int temp2=a[max];
        a[min]=a[i];
        a[max]=a[(a.length-1)-i];
        a[i]=temp1;
        a[(a.length-1)-i]=temp2;
    }
}
publicstaticvoiddualselectionsort(int[]a){

对于(int i=0;i,在外循环的每次迭代中,首先将第一个索引(i)作为初始最小索引,最后一个索引(a.length-1-i)作为初始最大索引。然后将这两个索引与范围i+1到a.length-i-1中的所有索引进行比较。但是如果第一个索引(i)实际上包含max值,您永远不会将其与[max]进行比较,因此[max]永远不会在内部循环的末尾包含正确的值

下面是一个建议的修复方法:

public static void dualSelectionSort(int[]a) {
    for(int i = 0; i < a.length - i - 1; i++) {
        if (a[i] > a[(a.length - 1) - i]) {
            int temp = a[i];
            a[i] = a[(a.length - 1) - i];
            a[(a.length - 1) - i] = temp;
        }
        int min = i;
        int max = (a.length - 1) - i;
        for (int j = i + 1; j < (a.length -1 ) - i; j++) {
            if(a[j] < a[min]) {
                min = j;
            }
            if(a[j] > a[max]) {
                max = j;
            }
        }
        int temp1 = a[min];
        int temp2 = a[max];
        a[min] = a[i];
        a[max] = a[(a.length - 1) - i];
        a[i] = temp1;
        a[(a.length - 1) - i] = temp2;
    }
}
publicstaticvoiddualselectionsort(int[]a){
for(int i=0;ia[(a.length-1)-i]){
int temp=a[i];
a[i]=a[(a.长度-1)-i];
a[(a.长度-1)-i]=温度;
}
int min=i;
int max=(a.length-1)-i;
对于(int j=i+1;j<(a.长度-1)-i;j++){
如果(a[j]a[max]){
max=j;
}
}
int temp1=a[min];
int temp2=a[max];
a[min]=a[i];
a[max]=a[(a.长度-1)-i];
a[i]=temp1;
a[(a.长度-1)-i]=temp2;
}
}
我改变了三件事:

  • 外部循环结束的时间可能比您结束它的时间要快得多—一次
    i>=a.length-i-1
    —因为在每次迭代中,您都会找到最小值和最大值,所以您会将剩余的未排序数组减少2

  • 初始化
    min
    max
    索引时,确保
    min
    索引实际包含的值小于
    max
    索引。如果
    a[i]>a[(a.length-1)-i]
    ,请在将
    min
    设置为
    i
    max
    设置为
    (a.length-1)-i
    之前交换它们

  • 内部循环应该从
    i+1
    迭代
    j
    (a.length-1)-i-1


  • 问题在于内部循环

    它是从i+1开始的。 所以比较max的代码实际上是比较a[1]和a[4]

    您可以将其更改为
    for(int j=i;jt这还不够。尝试输入
    [4,5,2,1,6,10,3,9,8,0,7]
    和建议的修复程序将产生
    [0,1,2,3,4,6,6,7,8,9,10]
    。感谢您指出这一点!是正确的。以前的解决方案是不够的,如果
    i==max
          if(i==max) {
                swap(a,max,a.length-1-i);
                swap(a,min,i);
            }else {
                swap(a,min,i);
                swap(a,max,(a.length-1)-i);
            }  
    
    public static void dualSelectionSort(int[]a) {
        for(int i=0; i<a.length-1;i++) {
            int min=i;
            int max=(a.length-1)-i;
    
            for (int j=i;j<a.length-i;j++) {
                if(a[j]<a[min]) {
                    min=j;
                }
                if(a[j]>a[max]) {
                    max=j;
                }
            }
            if(i==max) {
                swap(a,max,a.length-1-i);
                swap(a,min,i);
            }else {
                swap(a,min,i);
                swap(a,max,(a.length-1)-i);
            }       
        }
    }
    
    public static void swap(int[] a,int i,int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }