8236. Сортировка четных и нечетных

 

Задана последовательность целых чисел. Отсортируйте заданную последовательность так, чтобы сначала были расположены нечетные числа в возрастающем порядке, а потом четные числа в убывающем порядке.

 

Вход. Первая строка содержит количество чисел n (1 ≤ n ≤ 1000). Вторая строка содержит n чисел, не превосходящих по модулю 2 * 109.

 

Выход. В одной строке выведите последовательность чисел, упорядоченную согласно условию задачи.

 

Пример входа

Пример выхода

7

9 2 3 -6 -5 4 7

-5 3 7 9 4 2 -6

 

 

РЕШЕНИЕ

сортировка

 

Анализ алгоритма

Отсорируем числа согласно следующего компаратора f(int a, int b):

·        если a и b имеют разную четность, то четное число должно стоять после нечетного;

·        если a и b четные, то сортировать следует по убыванию;

·        если a и b нечетные, то сортировать следует по возрастанию;

Следует учесть, что входные числа могут быть как положительные так и отрицательные.

 

Реализация алгоритма

Функция abs вычисляет модуль числа.

 

int abs(int n)

{

  return (n > 0) ? n : -n;

}

 

Объявим компаратор f.

 

int f(int a, int b)

{

 

Если a и b имеют разную четность, то четное число должно стоять после нечетного.

 

  if (abs(a % 2) != abs(b % 2)) return abs(a % 2) > abs(b % 2);

 

Если a и b четные, то сортировать следует по убыванию.

 

  if (a % 2 == 0) return a > b;

 

Если a и b нечетные, то сортировать следует по возрастанию.

 

  if (abs(a % 2) == 1) return a < b;

}

 

Основная часть программы. Читаем входную последовательность чисел.

 

scanf("%d", &n);

v.resize(n);

for (i = 0; i < n; i++)

  scanf("%d", &v[i]);

 

Сортируем массив.

 

sort(v.begin(), v.end(), f);

 

Выводим упорядоченную последовательность чисел.

 

for (i = 0; i < n; i++)

  printf("%d ", v[i]);

printf("\n");

 

Реализация алгоритма – Heap Sort

 

#include <stdio.h>

#define MAX 1001

 

int i, n;

int m[MAX];

 

int abs(int n)

{

  return (n > 0) ? n : -n;

}

 

int f(int a, int b)

{

  if (abs(a % 2) != abs(b % 2)) return abs(a % 2) > abs(b % 2);

  if (a % 2 == 0) return a > b;

  if (abs(a % 2) == 1) return a < b;

}

 

int left(int i)

{

  return 2 * i;

}

 

int right(int i)

{

  return 2 * i + 1;

}

 

void swap(int &i, int &j)

{

  int temp = i;  i = j; j = temp;

}

 

// max - heap

void heapify(int a[], int i, int n, int f(int a, int b))

{

  int largest = 0;

  int l = left(i);

  int r = right(i);

 

  if (l <= n && f(a[i], a[l])) largest = l;

  else largest = i;

  if (r <= n && f(a[largest], a[r])) largest = r;

 

  if (largest != i)

  {

    swap(a[i], a[largest]);

    heapify(a, largest, n, f);

  }

}

 

void BuildHeap(int a[], int n, int f(int a, int b))

{

  for (int i = n / 2; i > 0; i--)

    heapify(a, i, n, f);

}

 

void HeapSort(int a[], int n, int f(int a, int b))

{

  BuildHeap(a, n, f);

  for (int i = n; i >= 2; i--)

  {

    swap(a[1], a[i]);

    heapify(a, 1, i - 1, f);

  }

}

 

int main(void)

{

  scanf("%d", &n);

  for (i = 1; i <= n; i++)

    scanf("%d", &m[i]);

 

  HeapSort(m, n, f);

 

  for (i = 1; i <= n; i++)

    printf("%d ", m[i]);

  printf("\n");

  return 0;

}

 

Java реализация

 

import java.util.*;

 

class Main

{

  public static class MyFun implements Comparator<Integer>

  {

    public int compare(Integer a, Integer b)

    {

      if (Math.abs(a % 2) != Math.abs(b % 2))

        return Math.abs(b % 2) - Math.abs(a % 2);

      if (a % 2 == 0) return b - a;

      return a - b;

    }

  }

  public static void main(String[] args)

  {

    Scanner con = new Scanner(System.in);

    int n = con.nextInt();

    Vector<Integer> m = new Vector<Integer>();

    for (int i = 0; i < n; i++)

    {

      int val = con.nextInt();

      m.add(new Integer(val));

    }

   

    Collections.sort(m, new MyFun());

   

    for (int i = 0; i < n; i++)   

      System.out.print(m.get(i) + " ");

    System.out.println();

    con.close();

  }

}

 

Python реализация

 

from functools import cmp_to_key

 

def compare(a, b):

  if abs(a % 2) != abs(b % 2): return abs(b % 2) - abs(a % 2)

  if a % 2 == 0: return b - a;

  return a - b;

 

n = int(input())

lst = map(int, input().split())

res = sorted(lst, key = cmp_to_key(compare))

print(*res)