选择排序没有按降序排序

时间:2015-03-14 13:40:52

标签: java arrays sorting selection-sort

这是我的作业:我想知道在选择排序中有多少比较和交换。当我以相反或降序的方式声明我的数组时:

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);
    }
}

1 个答案:

答案 0 :(得分:0)

这有一个非常简单的原因可以显示发生的EXCHANGES错误计数。如果你按照这里的代码:

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

迭代2:

// i - 1 = 1
// i > 0 = true
// arr[i] = i;
// arr[1] = 1;
// print statement

迭代3:

// i - 1 = 0
// i > 0 = false
// arr = { 0, 1, 2 } 

尝试使用此方法填充反向排序数组:

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