2010-05-23 3 views
3

Учитывая массив случайных чисел, сортируйте нечетные элементы в порядке убывания и четные числа в порядке возрастания.Сортировка нечетных по убыванию и даже по возрастанию

Пример входных данных: (1,4,5,2,3,6,7)
Выход: (7,5,3,1,2,4,6)

Оптимизировать для временной сложности.

+1

Звучит как домашнее задание? – Donnie

+0

Так что ты спрашиваешь? Как его оптимизировать? Люди обычно ценят какую-то попытку, прежде чем они захотят помочь вам. (т. е. размещать некоторый код, и люди будут рады помочь вам его оптимизировать) – Adam

+1

«Вопрос интервью Microsoft» http://geeksforgeeks.org/forum/topic/microsoft-interview-question-for-software-engineerdeveloper-about-arrays – WhirlWind

ответ

2

Какой язык это, C или C++ (я вижу, как теги)

В C++ можно использовать std::sort() с соответствующей функцией заказа. В C qsort() работает аналогично:

#include <iostream> 
#include <algorithm> 
bool Order(int a, int b) 
{ 
     if (a%2 != b%2) return a%2; 
     else return a%2 ? b<a : a<b; 
} 
int main() 
{ 
     int a[] = {1,4,5,2,3,6,7}; 
     size_t N = sizeof(a)/sizeof(a[0]); 

     std::sort(a, a+N, Order); 

     for(size_t i=0; i<N; ++i) 
       std::cout << a[i] << ' '; 
     std::cout << std::endl; 

} 
+0

Я всегда подозрительно, когда вижу целые числа, объединенные с оператором модуля. Работает ли ваше решение с отрицательными цифрами? – fredoverflow

+1

В компиляторах я могу проверить это, но вы правы, конечно, это реализация, определенная в C++ для '5.6/4 [expr.mul]', с примечанием, что округление до нуля является предпочтительным. – Cubbi

0
// Sort with a custom comparison function 
// returns -1 if a before b, 0 if a==b, 1 if a after b 
int _cmp(a,b) { 
    if (a % 2) == 0 { 
    if (b % 2) == 0 { 
     return (a>b) ? 1 : (a==b) 0 : -1; # Even(a) vs Even(b) 
    } else { 
     return 1; # Even(a) vs Odd(b) all evens are after all odds 
    } 
    } else { 
    if (b % 2) == 0 { 
     return -1; # Odd(a) vs Even(b) all odds are before all evens 
    } else { 
     return (b>a) ? 1 : (a==b) 0 : -1; # Odd(a) vs Odd(b) has reverse order 
    } 
    } 
} 
1

Вот с # один вкладыш:

int[] x = { 1,4,5,2,3,6,7 }; 
Array.Sort(x, (a, b) => a % 2 == 0 ? b % 2 == 0 ? a.CompareTo(b) : 1 : b % 2 == 0 ? -1 : -1 * a.CompareTo(b)); 

Не превращайте его к своему учителю. Ваш учитель хочет, чтобы вы сами реализовали алгоритм сортировки, поэтому он знает, что вы можете это сделать, и знает, что вы понимаете, что связано с этим.

На практике вы почти никогда не будете делать это на работе. У вашей платформы уже есть высоко оптимизированные методы сортировки, и вы хотите использовать их, будь то C# Array.Sort() или .OrderBy() или алгоритм C++ stl. Этот код должен был показать вам, как вы могли бы решить эту проблему в реальном мире, хотя, если бы я хотел, чтобы это прошло проверку кода, я бы не смог сжать все это на одной строке.

0

С целыми числами в качестве цели сортировки вы можете получить это для сортировки O (n), используя сортировку count и немного осторожность.

+0

Сортировка ?!? Да, O (n) ... если вы не возражаете против подразумеваемой константы 2^32 или около того. – Charles

+0

Хорошо, позвольте мне изменить это на байты вместо ints - я прочитал его диапазон и предполагаемые байты. Виноват. BTW, 4n, если вы сделаете это за 4 прохода ... –

1

Просто чтобы дать альтернативное решение:

#include <algorithm> 
#include <functional> 

bool is_odd(int x) 
{ 
    return x & 1; 
} 

int* rushakoff(int* begin, int* end) 
{ 
    int* middle = std::partition(begin, end, is_odd); 
    std::sort(begin, middle, std::greater<int>()); 
    std::sort(middle, end, std::less<int>()); 
    return middle; 
} 

int main() 
{ 
    int array[] = {1,4,5,2,3,6,7}; 
    rushakoff(array, array + 7); 
} 

Может быть, не так оптимально, но вполне читаемым. Это тоже важно ;-)

+0

'int * rushakoff' ??? WTF, моя фамилия не «вполне читаема». –

Смежные вопросы