按顺序重新排列数组 - 最小,最大,第二小,第二大,

时间:2017-08-27 17:12:37

标签: java arrays algorithm

public class RearrageArrayOrder {

public static void main(String[] args)
{
    int arr[]= { 5, 8, 1, 4, 2, 9, 3, 7, 6 };
    Arrays.sort(arr);
    int n=arr.length;
    for(int i=0,j=n-1;i<=n/2 ;i++,j--)
    {
        System.out.print(arr[i]+" "+arr[j]+" ");
    }
}

}

期望输出:1 9 2 8 3 7 4 6 5

我的输出:1 9 2 8 3 7 4 6 5 5

将奇数长度的排序数组的中间元素两次。对于偶数长度输出是正确的。

先谢谢

4 个答案:

答案 0 :(得分:3)

排序部分是正确的,但是你在打印部分搞砸了。只需要打印两个元素,直到找到相同的索引或者留下一个大于右的索引。

for(i=0,j=n-1;i<j;i++,j--) // i and j are declared outside loop.
{
 System.out.print(arr[i]+" "+arr[j]+" ");
}
if(i==j)
  print(arr[i]);

我在循环外部比较了ij而不是内部,以保存整个比较的数量。 (一般情况下)

对于中间人,只需打印一次,检查循环外的索引。

你怎么能自己解决它?

  1. 通过干运行代码并理解它为什么这样做?为什么偏离正确答案?

  2. 学习使用调试器逐步完成代码。当你开始写作甚至阅读更大的代码时,它可能会有所帮助。

答案 1 :(得分:1)

这是解决您问题的非常简单的方法

   int arr[]= { 5, 8, 1, 4, 2, 9, 3, 7, 6 };
    Arrays.sort(arr);
    int n=arr.length;
    for(int i=0, j=n-1; i<=j; i++, j--){
        if(i !=j)
        System.out.print(arr[i]+" "+arr[j]+" ");
        else{
            System.out.print(arr[i]);
        }

    }

答案 2 :(得分:1)

尽管现有的答案确实解决了这里所需的问题。然而,采用相同的方法可能是:

public static void main(String[] args) {
    int arr[] = {5, 8, 1, 4, 2, 9, 3, 7, 6, 10};
    Arrays.sort(arr);
    while (arr.length != 0) { // unless there is any element in arr
        System.out.print(arr[0] + " "); // print the first element
        arr = Arrays.copyOfRange(arr, 1, arr.length); // clone the remaining elements
        arr = reverseArray(arr); // reverse the array
    } // repeat
}

其中reverseArray如下:

private static int[] reverseArray(int[] arr) {
    int n = arr.length - 1;
    int[] temp = new int[n + 1];
    int i = 0;
    while (i <= n) {
       temp[i] = arr[n - i];
       i++;
    }
    return temp;
}

并且应该添加reverseArray方法来解决每次迭代翻转数组的问题。

答案 3 :(得分:0)

    int n = array.length;
    for(int i=0,j=n-1;i<=n/2 ;i++,j--)
    {
        System.out.print(arr[i]+" "+arr[j]+" ");
    }

你需要了解这里发生的事情。正如你所说的中间因为偶数长度输出是正确的。但奇数长度的两倍。让我们检查你的陈述。

您在打印声明中每次都打印arr[i]arr[j]。其中ij充当数组的index

说,长度是均匀的。

  

1 2 3 4 5 6 7 8

n = array.length/2; // 4 因为你的条件说循环将移动到i <= n 所以运行循环。 这就是正在发生的事情。

  

i ------ j

0 ---- 7     // arrayelements 1 8

1 ---- 6     // arrayelements 2 7

2 ---- 5    //  arrayelements 3 6

3 ---- 4    // arrayelements  4 5

4 ---- 3    // arrayelements  5 4

5   // i > n ; out of the loop!
     

输出1 8 2 7 3 6 4 5 5 4 //即使是偶数长度,输出也是错误的

要解决这个问题,你最好放i = n/2 - 1但这会改变当前长度为奇数的输出。(你不会得到中间元素的两倍)实际上你不会然后打印中间索引元素。

所以,保持你的逻辑, 我会建议这个

 for(int i=0,j=n-1;i<=n/2 ;i++,j--)
 {
     if(n%2 == 0)  // if length is even
     {
         if(i==n/2)
         {
             break;      //not printing twice the elements as you can see above instead breaking out of the loop
         }
         else{
              System.out.print(arr[i]+" "+arr[j]+" ");
         }
      }
      else        //if length is odd
      {
          if (i == n/2)
          {
              System.out.print(arr[i]);     // when i has reached n/2 print value of i (one time of middle element, like 5 in your case) and break
               break;
           }
           else{
                System.out.print(arr[i]+" "+arr[j]+" ");
            }

       }


 }