1

我有这个代码;

它们都使用system.out.println语句来打印出数组元素。最初我使用 return 语句Arrays.toString(array)来显示 main 方法中运行良好的数组。现在我可以使用 print 语句来降低复杂性。如您所见,输出表单排序缺少数组中的最后一个元素,这是因为我使用的是array.length -1. 但是,如果我不使用array.length -1我会得到一个.ArrayIndexOutOfBoundsException所以任何人都有一个实用的解决方案吗?

import java.util.Arrays;
public class SortMethod
{
    static int[] array = {2,1,5,3,5};


    public void sort(int[] arrays)
    {

        for(int i = 0;i < arrays.length - 1;i++ )
        {
            int store = 0;
            if (arrays[i + 1 ] < arrays[i])
            {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
        }

        System.out.println();
    }

    public void reverse (int[] arrays)
    {   
        for (int i=arrays.length-1; i >=0; i--)
        {
            System.out.print(arrays[i]);
        }


    }
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        SortMethod sort = new SortMethod();
        sort.sort(array);
        sort.reverse(array);

    }

}

输出;

From Sort:1235
From Reverse:55321
4

5 回答 5

2

首先,您的排序方法实际上并没有正确排序。您检查值的左侧紧邻值,但是如果列表末尾有一个 4 会发生什么?

{2,1,5,3,5,4}

将返回结果:

123545

这几乎没有排序......您需要获取您切换的每个值,并向后检查它,确保它不小于之前的值。现在,您将值排序到右侧,但永远不会回到左侧。

你也可以只做排序算法,然后遍历数组然后打印值,而不是尝试在排序方法的中间打印它们:

public class TestCode
{
static int[] array = {2,1,5,3,5,4,9,1,99,7};


public void sort(int[] arrays)
{

    for(int i = 0; i < arrays.length - 1 ;i++ )
    {
        int store = 0;
        // Move larger values to the right
        if (arrays[i] > arrays[i + 1])
        {
            store = arrays[i];
            arrays[i] = arrays[i + 1];
            arrays[i + 1] = store;
            // Sort swapped smaller values to the left
            for(int j = i; j > 1; j--)
            {
                if (arrays[j] < arrays[j - 1])
                {
                    store = arrays[j];
                    arrays[j] = arrays[j - 1];
                    arrays[j - 1] = store;
                }
            }

        }
    }

    for(int i = 0; i < array.length; i ++)
    {
        System.out.print(arrays[i] + " ");
    }
    System.out.println();
}

public void reverse (int[] arrays)
{   
    for (int i=arrays.length-1; i >=0; i--)
    {
        System.out.print(arrays[i] + " ");
    }


}
/**
 * @param args
 */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub

        TestCode sort = new TestCode();
        sort.sort(array);
        sort.reverse(array);

    }

}

给出输出:

1 1 2 3 4 5 5 7 9 99

99 9 7 5 5 4 3 2 1 1

概括:

对数组进行排序时,您需要遍历数组array.length - 1时间以比较值(您不需要将最后一个值与其右侧的值进行比较,因为没有)。

打印数组时,您需要遍历它array.length并打印出每个值。您的主要问题来自尝试在排序算法中打印出数组,该算法仅array.length - 1在您可能应该只在排序算法之外打印数组时迭代数组时间。

于 2013-09-01T04:15:53.600 回答
1

函数的最后一行public void sort(int[] arrays)

   System.out.println();

应该

System.out.println(arrays[arrays.length - 1]);

因为你想打印孔阵列。

并且为了记录,该public void sort(int[] arrays)函数实际上并未对数组进行排序。这不是sort只通过检查和交换相邻元素的一次就应该做的事情。

例如,如果array初始化为:

static int[] array = {2,1,5,3,5};

结果数组sort是:53215,反转数组是51235。两者都不是预期的结果。

于 2013-09-01T03:26:34.883 回答
1

sort()中,您从 0 迭代到arrays.length-1排他性),因此对于 arrays.length==5 变量,将取值:0、1、2、3

reverse()中,您从arrays.length-1包括)迭代到 0 - i将取值:4、3、2、1、0。

当您从sort()中的arrays.length-1中删除-1部分时,您将获得 ArrayOutOfBoundsException,因为您引用了数组 [i + 1],这将超出 i==4 的数组范围。

于 2013-09-01T03:27:15.057 回答
1

更改排序方法如下:

public void sort(int[] arrays) {
        // int i = 0;
        for (int i = 0; i < arrays.length - 1; i++) {
            int store = 0;
            if (arrays[i + 1] < arrays[i]) {
                store = arrays[i];
                arrays[i] = arrays[i + 1];
                arrays[i + 1] = store;

            }
            System.out.print(arrays[i]);
            if (i + 1 == arrays.length - 1) {
                System.out.print(arrays[i + 1]);
            }
        }

        System.out.println();
    }

刚刚添加了一个新的打印语句

if (i + 1 == arrays.length - 1) {
System.out.print(arrays[i + 1]);
}  

打印最后一个数组元素。

于 2013-09-01T03:51:59.433 回答
1

首先我想指出代码是不完整的。这只是排序代码的一半,我可以看到您正在尝试使用冒泡排序,但不幸的是缺少内部循环。

除此之外,这段代码没有问题。

你能用下面给出的方法替换你的排序方法吗?这将解决所有问题。

 public void sort(int[] a){
    int temp = 0;
    for(int i = 0 ; i < a.length ; i++){
      for(int j = 0 ; j< a.length - 1 ; j++){
        if(a[j] > a[j+1]){
          temp = a[j];
          a[j] = a[j+1];
          a[j+1]=temp;
        }

      }

    }
    printArray(a);
  System.out.println();
}


public void printArray(int[] a){
    for(int i = 0 ; i < a.length ; i++){
        System.out.print(a[i]);
    }
}

另外,我建议您阅读有关排序技术的信息。您可以随时访问排序文章

于 2013-09-01T04:38:26.023 回答