Java 选择排序没有';t按降序排序

Java 选择排序没有';t按降序排序,java,arrays,sorting,selection-sort,Java,Arrays,Sorting,Selection Sort,这是我的作业:我想知道有多少比较和交流发生在选择排序中。当我以相反或降序声明数组时,如下所示: int arr[] = { 5, 4, 3, 2, 1 }; …它运行良好,并且计数比较和交换,但当我尝试以相反的顺序给出“n”并填充数组时,它以降序填充,但按降序排序以计数交换时,它无法正常工作,尽管它计数比较 代码如下: public class SelectionSort { /** * @param args the command line arguments

这是我的作业:我想知道有多少比较和交流发生在选择排序中。当我以相反或降序声明数组时,如下所示:

int arr[] = { 5, 4, 3, 2, 1 };
…它运行良好,并且计数比较和交换,但当我尝试以相反的顺序给出“n”并填充数组时,它以降序填充,但按降序排序以计数交换时,它无法正常工作,尽管它计数比较

代码如下:

public class SelectionSort {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        Scanner in = new Scanner(System.in);
        int compares = 0, exchanges = 0, x;
        x = in.nextInt();
        int[] arr = new int [x];
        int n = arr.length;
        int s = 0;
        int min;
        int temp, i, j;
        System.out.print("Filling Array");
        for(i = n - 1; i > 0; i--)
        {
            arr[i] = i;
            System.out.print(" " + arr[i]);
        }
        System.out.println("");
        for(i = 0; i < n ; i++)
        {
            min = i ;

            for(j = i + 1; j < n; j++)
            {
                compares++;
                if(arr[min] > arr[j])
                    min = j;
            }

            if(min != i)
            {
                exchanges++;
                temp = arr[i];
                arr[i] = arr[min];
                arr[min] = temp;
            }

            System.out.println("Iteration " + (++s));
            for(int a = 0; a < arr.length; a++)
                System.out.print(" " + arr[a]);

            System.out.println("");
        }
        System.out.println("");
        System.out.println("Compares -- >> " + compares);
        System.out.println("Exchanges -->> " + exchanges);
    }
}
公共类选择排序{
/**
*@param指定命令行参数
*/
公共静态void main(字符串[]args){
//此处的TODO代码应用程序逻辑
扫描仪输入=新扫描仪(系统输入);
int=0,exchanges=0,x;
x=in.nextInt();
int[]arr=新的int[x];
int n=阵列长度;
int s=0;
int-min;
内部温度,i,j;
系统输出打印(“填充阵列”);
对于(i=n-1;i>0;i--)
{
arr[i]=i;
系统输出打印(“+arr[i]);
}
System.out.println(“”);
对于(i=0;iarr[j])
min=j;
}
如果(最小!=i)
{
交流++;
温度=arr[i];
arr[i]=arr[min];
arr[min]=温度;
}
System.out.println(“迭代”+(++s));
对于(int a=0;a>”+比较);
System.out.println(“交换-->>”+交换);
}
}

这有一个非常简单的原因,即显示发生的
交换的错误计数。如果您遵循此处的代码:

System.out.print("Filling Array");
for(i = n - 1; i > 0; i--)
{
    arr[i] = i;
    System.out.print(" " + arr[i]);
}
明白了吗?数组从不按降序填充或排序,只能按相反顺序打印

让我们假设
n=3
,当数组初始化时,它是
{0,0,…}
,并遵循以下循环:

迭代1:

// i = n - 1 = 2
// i > 0 = true
// arr[i] = i;
// arr[2] = 2;
// print statement
// i - 1 = 1
// i > 0 = true
// arr[i] = i;
// arr[1] = 1;
// print statement
// i - 1 = 0
// i > 0 = false
// arr = { 0, 1, 2 } 
迭代2:

// i = n - 1 = 2
// i > 0 = true
// arr[i] = i;
// arr[2] = 2;
// print statement
// i - 1 = 1
// i > 0 = true
// arr[i] = i;
// arr[1] = 1;
// print statement
// i - 1 = 0
// i > 0 = false
// arr = { 0, 1, 2 } 
迭代3:

// i = n - 1 = 2
// i > 0 = true
// arr[i] = i;
// arr[2] = 2;
// print statement
// i - 1 = 1
// i > 0 = true
// arr[i] = i;
// arr[1] = 1;
// print statement
// i - 1 = 0
// i > 0 = false
// arr = { 0, 1, 2 } 
尝试以下方法填充反向排序数组:

for (i = n - 1, z = 0; i > 0; i--, z++)
{
    arr[z] = i;
}

您能否给出一些示例,说明与您的程序为给定数组提供的内容相比,预期的比较和交换是什么?如果我运行您的代码并输入4,它会打印:
填充数组3 2 1
迭代1
0 1 2 3
迭代2
0 1 2 3
迭代30 1 2 3
迭代4
<01 2 3
比较-->>6
交换-->>0
不确定您期望它是什么。假设我有一个数组{2,1,3,4},现在函数检查每个元素是否大于下一个,然后交换,所以exchange++,在这个数组中,只有一个交换发生,而6比较查找大小“现在函数检查每个元素”,问题是除了
main
函数aka方法之外,我在代码中没有看到任何函数。@WonderWorld看到您以相反的顺序填充数组,并且它以升序运行迭代,因此如果您的数组仅以升序进行比较,则不会发生任何交换