对数组进行排序,以便第一个和最后一个元素形成“对”

时间:2015-12-02 20:42:26

标签: java arrays sorting indices

我有一个对象数组,我想按以下顺序按索引排序。我的数组大小总是2的幂。

示例数组大小:8。索引:[0][1] [2][3] [4][5] [6][7]

排序后:[0][7] [1][6] [2][5] [3][4]

所以基本上在第一个和最后一个元素之间交替,但尚未排序。

我已经想到了这样做的方法,我可以得到“对”,但它们的顺序错误(我认为它不适用于2阵列的强大功能吗?)。 在这里,我使用int数组及其索引作为值,以使我自己更简单。

int[] array = new int[]{0,1,2,3,4,5,6,7};
int[] sortedArray = new int[8];
for(int i = 0; i < array.length; i+=2){
    sortedArray[i] = array[i];
}
for(int i = 1; i < array.length; i+=2){
    sortedArray[i] = array[array.length - i];
}

输出:[0][7] [2][5] [4][3] [6][1]

4 个答案:

答案 0 :(得分:5)

您可以使用单个循环执行此操作。请考虑以下算法:

int[] array = new int[]{0,1,2,3,4,5,6,7};
int[] sortedArray = new int[8];
for(int i = 0; i < array.length; i+=2){
    sortedArray[i] = array[i/2];
    sortedArray[i + 1] = array[array.length - i/2 - 1];
}
System.out.println(Arrays.toString(sortedArray)); // prints [0, 7, 1, 6, 2, 5, 3, 4]

这通过一次设置两个值来创建最终数组:

  • 结果数组的每个偶数索引都使用初始数组的第一个值进行映射
  • 结果数组的每个奇数索引都使用初始数组的最后一个值进行映射

答案 1 :(得分:0)

这是一种递归方法,并且存在改进。

动机:逐步完成数组,直到您只剩下两个要比较的值。完成后,只需打印它们。否则,打印该值并继续切片。我们使用两个索引位置来帮助我们遍历数组,因为每个位置都控制着数组的末尾。当我们的开始和结束索引之间的差异为1时,我们停止递归。

防止愚蠢事情的步骤,比如零长度数组,我留给读者练习。

public static void arrangeArray(int[] array) {
    arrangeArray(array, 0, array.length - 1);
}

private static void arrangeArray(int[] array, int startIndex, int endIndex) {
    System.out.printf("[%d][%d]\t", array[startIndex], array[endIndex]);
    if(endIndex - startIndex > 1) {
        arrangeArray(array, startIndex + 1, endIndex - 1);
    }
}

答案 2 :(得分:0)

您可以按照此列表与索引的工作方式扩展List然后Override,以便0保持01在物理上变为{{1}在你的内部数组中。

如果您正确实现此对象,2将无法看到差异。然后,您可以添加方法来获取内部数组,无论您需要做什么。

这种方法的优点是性能。您不必在第二步中自己加扰列表。

答案 3 :(得分:0)

class swap
{
public static void main(String args[])
{
int arr[]={0,1,2,3,4,5,6,7};
int sorted[]=new int[8];
int end=7;
int i=1,j;
for(int k=0;k<8;k++)
{
sorted[k]=arr[k];
}
for(j=1;j<8;j=j+2)
{
sorted[j]=arr[end];
end--;
}
for(j=2;j<8;j=j+2)
{
sorted[j]=arr[i];
i++;
}
for(int k=0;k<8;k++)
System.out.println(sorted[k]);
}
}