У меня есть упражнение, в котором я должен сортировать массив следующим образом:Отсортировать массив по оставшейся части 4
- числа, которые делят 4 без остатка будет первым в массиве (например, 4,8,12,16).
- номера, которые делят 4 с остатком 1, будут вторыми в массиве (1,5,9).
- числа, которые делят 4 с остатком 2, будут третьим в массиве (2,6,10).
- числа, которые делят 4 с остатком 3, будут последними в массиве.
Например, следующий массив:
int []a={1,7,3,2,4,1,8,14}
будет:
4 8 1 1 2 14 3 7
порядок внутри групп не имеет значения.
Я нашел решение, которое работает с временной сложностью O (n) и сложностью пространства O (1).
Однако он уродливый и перемещается по массиву 3 раза. Я хотел бы получить более элегантное решение.
Это мой код:
int ptr=a.length-1; int temp=0, i=0;
while (i<ptr){
//move 3 remained to the end
if (a[i] % 4==3){
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==2)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
i=0;
while (i<ptr){
if (a[i]%4==1)
{
temp=a[ptr];
a[ptr]=a[i];
a[i]=temp;
ptr--;
}
else
i++;
}
Важно знать:
- Я не хочу Трудоемкость хуже, чем O (N), и пространство сложности хуже, чем O (1).
Вы не можете сортировать по времени сложности лучше, чем 'О (п журнал (п))', не прибегая к алгоритмам, которые требуют дополнительных ограничений, таких как [радикс рода] (https: //en.wikipedia. орг/вики/Sorting_algorithm # Radix_sort). –
Вам нужно только отсортировать массив, но учитель не сказал вам сортировать его вручную, не так ли? Затем используйте простой «Comparator';) – fge
@MattBall: он фактически разбивается на 4 части, а не на сортировку. Таким образом, O (n) возможно. –