按特定顺序对数组进行排序
Sort the array in a specific order
我需要按特定的“降序”顺序对数组进行排序:在数组的开头或结尾交替插入元素。
如果元素的降序是a>b>c>d
,那么最后的数组应该是
[] -> [a,_,_,_] -> [a,_,_,b] -> [a,c,_,b] -> [a,c,d,b]
示例 1
输入:[4、13、8、9、7、1、6]
输出:[13, 8, 6, 1, 4, 7, 9]
示例 2
输入:[16、23、7、11、3、14]
输出:[23, 14, 7, 3, 11, 16]
如何找到解决此问题的方法?
我只尝试对第一个索引进行排序,但我还需要对最后一个索引进行排序。
public static void BubbleSort_First(int[] arr,int first){
int n = arr.length;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if(arr[i]==first){
if (arr[j] < arr[j + 1]) {
// swap arr[j+1] and arr[j]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
也许你可以在数组的排序版本上向后迭代,同时在数组的前面和后面分别保留指向下一个位置的两个指针:
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] a1 = {4, 13, 8, 9, 7, 1, 6};
System.out.printf("Input1 = %s%n", Arrays.toString(a1));
System.out.printf("Output1 = %s%n", Arrays.toString(frontBackSorted(a1)));
System.out.println();
int[] a2 = {16, 23, 7, 11, 3, 14};
System.out.printf("Input2 = %s%n", Arrays.toString(a2));
System.out.printf("Output2 = %s%n", Arrays.toString(frontBackSorted(a2)));
}
public static int[] frontBackSorted(int[] array) {
int[] sortedArray = IntStream.of(array).sorted().toArray();
int n = array.length;
int[] result = new int[n];
int i = 0, j = n - 1, k = n - 1;
boolean front = true;
while (i <= j) {
if (front) {
result[i++] = sortedArray[k--];
} else {
result[j--] = sortedArray[k--];
}
front = !front;
}
return result;
}
}
输出:
Input1 = [4, 13, 8, 9, 7, 1, 6]
Output1 = [13, 8, 6, 1, 4, 7, 9]
Input2 = [16, 23, 7, 11, 3, 14]
Output2 = [23, 14, 7, 3, 11, 16]
我需要按特定的“降序”顺序对数组进行排序:在数组的开头或结尾交替插入元素。
如果元素的降序是a>b>c>d
,那么最后的数组应该是
[] -> [a,_,_,_] -> [a,_,_,b] -> [a,c,_,b] -> [a,c,d,b]
示例 1
输入:[4、13、8、9、7、1、6]
输出:[13, 8, 6, 1, 4, 7, 9]
示例 2
输入:[16、23、7、11、3、14]
输出:[23, 14, 7, 3, 11, 16]
如何找到解决此问题的方法?
我只尝试对第一个索引进行排序,但我还需要对最后一个索引进行排序。
public static void BubbleSort_First(int[] arr,int first){
int n = arr.length;
for (int i = 0; i < n - 1; i++)
for (int j = 0; j < n - i - 1; j++)
if(arr[i]==first){
if (arr[j] < arr[j + 1]) {
// swap arr[j+1] and arr[j]
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
也许你可以在数组的排序版本上向后迭代,同时在数组的前面和后面分别保留指向下一个位置的两个指针:
import java.util.Arrays;
import java.util.stream.IntStream;
public class Main {
public static void main(String[] args) {
int[] a1 = {4, 13, 8, 9, 7, 1, 6};
System.out.printf("Input1 = %s%n", Arrays.toString(a1));
System.out.printf("Output1 = %s%n", Arrays.toString(frontBackSorted(a1)));
System.out.println();
int[] a2 = {16, 23, 7, 11, 3, 14};
System.out.printf("Input2 = %s%n", Arrays.toString(a2));
System.out.printf("Output2 = %s%n", Arrays.toString(frontBackSorted(a2)));
}
public static int[] frontBackSorted(int[] array) {
int[] sortedArray = IntStream.of(array).sorted().toArray();
int n = array.length;
int[] result = new int[n];
int i = 0, j = n - 1, k = n - 1;
boolean front = true;
while (i <= j) {
if (front) {
result[i++] = sortedArray[k--];
} else {
result[j--] = sortedArray[k--];
}
front = !front;
}
return result;
}
}
输出:
Input1 = [4, 13, 8, 9, 7, 1, 6]
Output1 = [13, 8, 6, 1, 4, 7, 9]
Input2 = [16, 23, 7, 11, 3, 14]
Output2 = [23, 14, 7, 3, 11, 16]