对数组进行排序,使第一个和最后一个元素形成 "pair"

sort an array, so that first and last element will form a "pair"

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

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

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

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

我已经想到了一种方法,我可以得到 "pairs" 但它们的顺序错误(而且我认为它不能与任何其他 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]

您可以使用一个循环来完成此操作。考虑以下算法:

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 时,我们停止递归。

防止愚蠢事情的步骤,例如零长度数组,我将其留作 reader 的练习。

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

您可以扩展 List 然后 Override 此列表使用索引的方式,因此 0 仍然是 01 在物理上变成了 2 在你的内部数组中。

如果您正确地实现了这个对象,Collections.sort() 将看不出有什么不同。然后你可以添加你的方法来为你必须做的任何事情获取内部数组。

这种方法的优点是性能。您不必在次要步骤中自己打乱列表。

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