Java - 反向选择排序

时间:2013-04-22 20:37:29

标签: java arrays sorting

我正在尝试创建一个执行选择排序但向后退的程序。如同,找到最大数字并用最后一个交换它。我不知道为什么这不起作用。

根据评论更新的代码。

  import java.util.Scanner;


public class Problem20 {


    public static void main(String[] args){

        int data[] = new int[10];
        Scanner scan = new Scanner(System.in);

        System.out.print("Please enter 10 numbers: ");
        for (int i = 0; i < 10; i++)
        {
        data[i] = scan.nextInt();
        }

        sortBig(data);

    }

    public static void sortBig(int[] data){

        int i, j, maxIndex, tmp;

          for (i = data.length - 1; i >= 0; i--) 
          {
                maxIndex = i;

                for (j = i-1; j >=0; j--)
                    if (data[j] > data[maxIndex])
                      maxIndex = j;
                    if (maxIndex != i) 
                    {
                      tmp = data[data.length - 1];
                      data[data.length - 1] = data[maxIndex];
                      data[maxIndex] = tmp;
                    }             
          }



        for (int r = 0; r < data.length; r++){
            System.out.print(data[r] + " ");
        }


    }


}

2 个答案:

答案 0 :(得分:0)

您需要撤消第一个for循环 - for(int i = data.length - 1; i >= 0; i--)

您还需要修改第二个for循环以反映第一个for循环中的更改(循环内部看起来很好,但循环初始化块需要更正)

答案 1 :(得分:0)

这是我编写的一个简单测试,可以轻松调试代码。

import org.junit.Test;

import java.util.Arrays;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

public class Problem20 {

    @Test
    public void testSorting() {
        // passes
        assertTrue(Arrays.equals(new int[]{1, 2, 3}, sortBig(3, 2, 1)));
        // failed previously
        assertTrue(Arrays.equals(new int[]{1, 2, 3, 4}, sortBig(4, 3, 2, 1)));
        // create an array of unique values in pseudo random order
        int[] largeArray = new int[1000];
        for (int i = 0; i < largeArray.length; i++)
            largeArray[i] = (i * 29) % largeArray.length;
        int[] sortedArray = sortBig(largeArray);
        for (int i = 0; i < largeArray.length; i++)
            assertEquals(i, sortedArray[i]);
    }

    public static int[] sortBig(int... data) {
        for (int i = data.length - 1; i >= 0; i--) {
            int maxIndex = i;

            for (int j = i - 1; j >= 0; j--)
                if (data[j] > data[maxIndex])
                    maxIndex = j;
            if (maxIndex != i) {
//                int tmp = data[data.length - 1];
                int tmp = data[i];
//                data[data.length - 1] = data[maxIndex];
                data[i] = data[maxIndex];
                data[maxIndex] = tmp;
            }
        }
        return data;
    }
}

我发现无法排序的最简单的列表是4,3,2,1并且通过调试它我可以看到你总是与最后一个元素交换,而不是被搜索的最后一个元素data.length -1 {{1在进行了这种替换后,测试甚至可以用于大型数组。