Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/34: Рейтинг темы: голосов - 34, средняя оценка - 4.85
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740

Сортировка слиянием: подсчитать количество перестановок

09.06.2014, 00:10. Показов 7059. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем. Дана задача: подсчитать количество перестановок при сортировке массива. Нужен быстрый алгоритм, желательно алгоритм сортировки слиянием. Вот код:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include <stdio.h>
#include <conio.h>
 
void Merge(int *A, int first, int last)
{
    int middle, start, final, j;
    int *mas=new int[last];
    middle = (first + last) / 2;
    start = first;
    final = middle + 1;
    for (j = first; j <= last; j++)
    {
        if ((start <= middle) && ((final>last) || (A[start]<A[final])))
        {
            mas[j] = A[start];
            start++;
        }
        else
        {
            mas[j] = A[final];
            final++;
        }
    }
    for (j = first; j <= last; j++)
    {
        A[j] = mas[j];
    }
    delete[]mas;
}
void MergeSort(int *A, int first, int last)
{
    if (first<last)
    {
        MergeSort(A, first, (first + last) / 2);
        MergeSort(A, (first + last) / 2 + 1, last);
        Merge(A, first, last);
    }
}
int main()
{
    int i, n;
    
    scanf("%d", &n);
    int *A = new int[n];
 
    for (i = 0; i < n; i++)
    {
        scanf("%d", &A[i]);
    }
 
    MergeSort(A, 1, n);
     
    for (i = 0; i < n; i++)
    {
        printf("%d", A[i]);
    }
    delete[]A;
    
    getch();
 
    return 0;
}
У меня 2 вопроса.
1. В какой части моего кода я должен вставить подсчет количества перестановок? Никак не могу понять.
2. У меня после ввода элементов массива выводит ошибку "Heap corruption Detected". Подскажите, в чем проблема?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.06.2014, 00:10
Ответы с готовыми решениями:

Быстрая сортировка, подсчитать количество перестановок элементов массива
Здравствуйте! Никак не могу подсчитать количество перестановок елементов массива в сортировке Хоара:( Сделал счетчик value в цикле while,...

Количество сравнений и перестановок в алгоритме слиянием
Привет всем, пробуй найти количество сравнений и перестановок в алгоритме слиянием. Но результат всегда зависит только от размерности...

Количество сравнений/перестановок в сортировке естественным слиянием
Добрый день ! Никак не могу понять как создать счётчик и куда его вставить , лазил по форумах и не нашел всё равно , помогите , если кто-то...

5
52 / 72 / 20
Регистрация: 23.01.2013
Сообщений: 273
09.06.2014, 00:31
Если вы пользуетесь MergeSort, то там сложно ввести такое понятие, как количество перестановок.
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
09.06.2014, 00:44  [ТС]
Tchikh, А разве можно как то по другому реализовать этот алгоритм? Препод сказал, что нужно использовать именно сортировку слиянием.
0
52 / 72 / 20
Регистрация: 23.01.2013
Сообщений: 273
09.06.2014, 00:51
Sh@dow777, в том-то и дело, что в самом алгоритме вы по сути не совершаете никаких перестановок элементов, вы лишь сливаете два подмассива в третий, поэтому задание выглядит странным
0
17 / 17 / 6
Регистрация: 10.12.2013
Сообщений: 740
09.06.2014, 02:17  [ТС]
Tchikh, Вот, собственно, само задание.

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

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

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

Я в инете нашел вот такие коды
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<class T> void Merge(T const *const A, int const nA,
                             T const *const B, int const nB,
                             T *const C)
{ //Выполнить слияние массива A, содержащего nA элементов,
  //  и массива B, содержащего nB элементов.
  //  Результат записать в массив C.
 
    int a(0), b(0); //Номера текущих элементов в массивах A и B
 
    while( a+b < nA+nB ) //Пока остались элементы в массивах
    {
        if( (b>=nB) || ( (a<nA) && (A[a]<=B[b]) ) )
        { //Копирую элемент из массива A
            C[a+b] = A[a];
            ++a;
        } else { //Копирую элемент из массива B
            C[a+b] = B[b];
            ++b;
        }
    }
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
template<class T> void MergeSort(T *const A, int const n)
{ //Отсортировать массив A, содержащий n элементов
 
    if( n < 2 ) return; //Сортировка не нужна
 
    if( n == 2 ) //Два элемента проще поменять местами,
    {            //  если нужно, чем делать слияние
        if( A[0] > A[1] ) { T const t(A[0]); A[0]=A[1]; A[1]=t; }
        return;
    }
   
    MergeSort(A    , n/2  ); //Сортируем первую половину
    MergeSort(A+n/2, n-n/2); //Сортируем вторую половину
 
    T *const B( new T[n] ); //Сюда запишем результат слияния
 
    Merge(A,n/2, A+n/2,n-n/2, B); //Слияние половин
 
    //Копирование результата слияния в исходный массив:
    for(int i(0); i<n; ++i) A[i]=B[i];
 
    delete[n] B; //Удаляем временный буфер
}
Но когда я ввожу строчку, как написано
C++
1
 Merge(A,n/2, A+n/2,n-n/2, B);
мне все подчеркивает.

Добавлено через 4 минуты
Tchikh, Сортировка пузырьком не помогает, так как долгий алгоритм.

Добавлено через 13 минут
Вопрос еще в силе. Скажите, как подсчитать количество перестановок в алгоритме сортировки слиянием?

Добавлено через 56 минут
Люди, срочно нужна помощь. Может мне надо использовать другой алгоритм?
0
52 / 72 / 20
Регистрация: 23.01.2013
Сообщений: 273
09.06.2014, 08:11
Sh@dow777, можешь попробовать использовать QSort
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.06.2014, 08:11
Помогаю со студенческими работами здесь

Подсчитать количество перестановок с 8 различными цифрами
Нужна помощь в решении следующей задачи: Подсчитать кол-во перестановок с 8 различными цифрами. Заранее огромное спасибо!!!

Правильно подсчитать количество перестановок и сравнений в сортировках
Здравствуйте, помогите, пожалуйста, правильно расставить Changes (Перестановки) и Compares (сравнения). Код программы на С++ Нужно,...

Подсчитать Количество перестановок при сортировке массива по возрастанию
Привет всем. Мне нужно написать программу, которая подсчитывает минимальное количество перестановок при сортировке массива по возрастанию....

Как подсчитать произведенное количество перестановок при быстрой сортировке?
имею такой код #include &lt;iostream&gt; using namespace std; void qSort (int a,int nStart, int nEnd) { int L,R,c,X; if...

подсчитать минимальное количество перестановок при сортировке массива по возрастанию
#include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; #include &lt;cstdlib&gt; using namespace std; void BubbleSort(int k, int...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru