Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Количество перестановок при сортировке  (Прочитано 8646 раз)
0 Пользователей и 1 Гость смотрят эту тему.
MahovIV
Новенький

ua
Offline Offline

« : 01-01-2014 13:00 » 

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

 Первая строка входных данных содержит единственное натуральное число 1 ≤ N < 500000 - длину сортируемой последовательности. Каждая из последующих N строк содержит целое число 0 ≤ a[i] ≤ 999999999, i-ый элемент последовательности. Все элементы последовательности различны.
 Выходные данные

 Выведите единственное целое число - минимальное количество перестановок соседних элементов последовательности, необходимое для того, чтобы отсортировать ее по возрастанию.
 Преподаватель сказал использовать не пузырьковую сортировку, а сортировку слиянием. Я нашёл код сортировки слиянием, но при массивах в 200000 элементов и более происходило переполнение стека. Как реализовать таую сортировку для больших массивов? Как подсчитать количество перестановок?
Программа выглядит так.
Код:
#include <stdio.h>

int main() {

int a[100], N, pr = 0, i, j, c;
scanf("%d", &N);
for(i = 0; i < N; i++) {
scanf("%d", &a[i]);
printf("\n");
}
for(i = 0; i < N; i++)
for(j = N - 2; j >= i; j--) {
if(a[j] > a[j + 1]) {
c = a[j];
a[j] = a[j + 1];
a[j + 1] = c;
pr++;
}
}
printf("%d\n", pr);
return 0;
}
Но преподаватель сказал, что нельзя использовать пузырькоую сортировку, а нужно использовать сортировку слиянием. Я находил много таких алгоритмов, но с их помощью нельзя отсортировать массив размером более 200000 элементов. Иными словами, нужен алгоритм с глобальными переменными. Покажите такой код, который бы сортировал большие массивы и чтобы можно было пересчитывать количество перестановок.
« Последнее редактирование: 02-01-2014 00:58 от Вад » Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 01-01-2014 16:49 » 

MahovIV, во-первых, что значит "нашёл". Тут важно, что ты понял, а не что нашёл.

Во-вторых, твой код может переполнять стек только из-за
Код: (C++)
int a[200000]
Следовательно, этот массив нужно создавать динамически в куче и потом удалять из неё. А также оформить указатель. Для C++ это операторы new и delete. Для C функции malloc и free.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
MahovIV
Новенький

ua
Offline Offline

« Ответ #2 : 01-01-2014 20:01 » 

Я не могу написать такую реализацию алгоритма.
Записан
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 01-01-2014 21:08 » new

MahovIV, а какая религия запрещает? Ко всему прочему массив будет точно под размер входных данных - без "запаса".
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines