对数组进行排序,使第一个和最后一个元素形成 "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
仍然是 0
但 1
在物理上变成了 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]);
}
}
我有一个对象数组,我想按以下顺序按索引对其进行排序。我的数组大小总是 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
仍然是 0
但 1
在物理上变成了 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]);
}
}