Поэтому я делаю вызов, расположенный по адресу https://www.hackerrank.com/challenges/quicksort2, и у меня возникают проблемы с тем, чтобы обмануть голову так, как они этого хотят. Они просят программу выполнить quicksort с помощью subArrays, а затем объединить эти вспомогательные массивы в конце, чтобы придумать результат. Вот вызов, и у меня будет мой код ниже. Разумеется, у меня нет работы. Весь код был предоставлен, и задача состоит в том, чтобы написать метод разделения
Print Sub-Arrays В этой задаче напечатайте свой массив каждый раз, когда закончите свой метод разбиения, т.е. Распечатайте каждый отсортированный подматрица. Первый элемент в подматрице должен использоваться как свод. Разделите левую сторону перед разделением правой стороны. Шарнир не должен добавляться ни в одну сторону. Вместо этого поместите его обратно посередине при объединении подмассивов вместе.
Формат ввода
Будут две строки ввода:
n - the size of the array
ar - the n numbers of the array
Выходной формат
Распечатайте каждый секционированный под-массив на новой строке.
Ограничения
1<=n<=1000
-1000<=x<= 1000 , x ∈ ar
There are no duplicate numbers.
Пример ввода
7
5 8 1 3 7 9 2
Образец вывода
2 3
1 2 3
7 8 9
1 2 3 5 7 8 9
Код
import java.util.*;
public class Solution {
static int[] result;
static void partition(int[] ar) {
int p = 0;
int s = 0;
int l = 0;
int small[] = new int[ar.length];
int pivot[] = new int[ar.length];
int large[] = new int[ar.length];
for(int i = 0; i < ar.length; i++){
if(i == 0 || ar[i]==pivot[0]){
pivot[p] = ar[i];
p++;
}
else if(ar[i]>pivot[0]){
large[l] = ar[i];
l++;
}
else if(ar[i]<pivot[0]){
small[s] = ar[i];
s++;
}
}
if(s>2){
int[] smallA = new int[s];
for(int i = 0; i < s; i ++){
smallA[i] = small[i];
}
partition(smallA);
}
if(l>2){
int[] largeA = new int[l];
for(int i = 0; i < l; i ++){
largeA[i] = large[i];
}
partition(largeA);
}
}
static void printArray(int[] ar) {
for(int n: ar){
System.out.print(n+" ");
}
System.out.println("");
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int[] ar = new int[n];
result = new int[n];
for(int i=0;i<n;i++){
ar[i]=in.nextInt();
}
partition(ar);
}
}
я должен использовать этот формат, я могу редактировать метод разделения, но остальное остается за правилами вызова
Я не проверял ваш код, но это, похоже, работает. Это проще сделать со списком
import java.util.*;
public class quickSorter
{
public quickSorter()
{
}
public List<Integer> partition(List<Integer> list){
int pivot = list.get(0);
List<Integer> result;
List<Integer> leftSide = new ArrayList<>();
List<Integer> rightSide = new ArrayList<>();
for (int i=0;i<list.size();i++){
if (list.get(i)<pivot){
leftSide.add(list.get(i));
}
else if (list.get(i)>pivot){
rightSide.add(list.get(i));
}
}
if (leftSide.size()>1){
result = this.partition(leftSide);
leftSide=result;
}
if (rightSide.size()>1){
result = this.partition(rightSide);
rightSide=result;
}
List<Integer> combined = new ArrayList<>();
combined.addAll(leftSide);
combined.add(pivot);
combined.addAll(rightSide);
//print out
for (int j:combined){
System.out.print(j+" ");
}
System.out.println();
return combined;
}
public static void main(String[] a){
quickSorter qs = new quickSorter();
List<Integer> list = new ArrayList<>();
System.out.println();
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i=0;i<n;i++){
list.add(in.nextInt());
}
System.out.println();
List<Integer> sorted = qs.partition(list);
}
}