我有一个对象数组,我想按以下顺序按索引排序。我的数组大小总是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]
答案 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
保持0
但1
在物理上变为{{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]);
}
}