Вы находитесь на странице: 1из 7

ЛАБОРАТОРНАЯ 10

АЛГОРИТМ СОРТИРОВКИ MERGESORT

Пример 1:
Допустим у нас есть одномерный массив элементов:

index1 0 1 2 3 4 5 6

X 10 80 30 90 40 50 70

Далее рассмотрим алгоритм MergeSort для сортировки элементов


по возрастанию:

#include <iostream>
using namespace std;
int x[20], n;
//***************************************************
void sortare(int st, int dr, int x[20]){
int aux;
if (x[st]>x[dr]) {
aux=x[st]; x[st]=x[dr]; x[dr]=aux;
}
}
//***************************************************
void interclasare(int st, int dr, int m, int x[20]){
int b[20], i, j, k;
i=st; j=m+1; k=1;
while(i<=m && j<=dr)
if(x[i]<=x[j]){
b[k]=x[i]; i++; k++;
}
else{
b[k]=x[j]; j++; k++;
}
if(i<=m)
for(j=i;j<=m;j++){
b[k]=x[j]; k++;
}
else
for(i=j;i<=dr;i++){
b[k]=x[i]; k++;
}
k=1;

1 din 7
for(i=st;i<=dr;i++){
x[i]=b[k]; k++;
}
}
//***************************************************
void divimp(int st, int dr, int x[20]){
int m;
if((dr-st)<=1) sortare(st, dr, x);
else{
m=(st+dr)/2; divimp(st,m,x); divimp(m+1,dr,x);
interclasare(st, dr, m, x);
}
}
// Функция вывода элементов массива
void afisareMasiv(int x[], int n){
for (int i = 0; i < n; i++){
cout << x[i] << " ";
}
cout << "\n";
}
// Главная программа
int main(){
int x[] = {10, 80, 30, 90, 40, 50, 70};
int n = sizeof(x)/sizeof(x[0]);
cout << "Одномерный массив: \n\t";
afisareMasiv(x, n);
cout << "Отсортированный по возрастанию одномерный массив:
\n\t";
divimp(1, n-1, x); afisareMasiv(x, n);
}

Результат выполнения программы C++:

Одномерный массив:
10 80 30 90 40 50 70
Отсортированный по возрастанию одномерный массив:
10 30 40 50 70 80 90

Пример 2:
Допустим у нас есть одномерный массив элементов:

index2 0 1 2 3 4 5 6

X A C M K B P T

2 din 7
Далее рассмотрим алгоритм MergeSort для сортировки элементов
по возрастанию:

#include <iostream>
using namespace std;
int x[20], n;
//***************************************************
void sortare(int st, int dr, char x[20]){
int aux;
if (x[st]>x[dr]) {
aux=x[st]; x[st]=x[dr]; x[dr]=aux;
}
}
//***************************************************
void interclasare(int st, int dr, int m, char x[20]){
int b[20], i, j, k;
i=st; j=m+1; k=1;
while(i<=m && j<=dr)
if(x[i]<=x[j]){
b[k]=x[i]; i++; k++;
}
else{
b[k]=x[j]; j++; k++;
}
if(i<=m)
for(j=i;j<=m;j++){
b[k]=x[j]; k++;
}
else
for(i=j;i<=dr;i++){
b[k]=x[i]; k++;
}
k=1;
for(i=st;i<=dr;i++){
x[i]=b[k]; k++;
}
}
//***************************************************
void divimp(int st, int dr, char x[20]){
int m;
if((dr-st)<=1) sortare(st, dr, x);
else{
m=(st+dr)/2; divimp(st,m,x); divimp(m+1,dr,x);
interclasare(st, dr, m, x);
}
}

3 din 7
// Функция вывода элементов массива
void afisareMasiv(char x[], int n){
for (int i = 0; i < n; i++){
cout << x[i] << " ";
}
cout << "\n";
}
// Главная программа
int main(){
int i;
char x[] = {'A','C','M','K','B','P','T'};
int n = sizeof(x)/sizeof(x[0]);
cout << "Одномерный массив: \n\t";
afisareMasiv(x, n);
cout << "Отсортированный по возрастанию одномерный
массив:\n\t";
divimp(1, n-1, x); afisareMasiv(x, n);
}

Результат выполнения программы C++:

Одномерный массив:
A C M K B P T
Отсортированный по возрастанию одномерный массив:
A B C K M P T

Предлагаемые задачи
1. Измените программу в Примере 1 так, чтобы мы получили
расположение элементов одномерного массива в порядке
убывания.

Одномерный массив:
10 80 30 90 40 50 70
Одномерный массив X, отсортированный по убыванию:
90 80 70 50 40 30 10
2. Измените программу из примера 2 так, чтобы мы получили
расположение элементов одномерного массива в порядке
убывания.
Одномерный массив: Y:
A C M K B P T
Одномерный массив Y, отсортированный по убыванию:
T P M K C B A

4 din 7
ЗАДАЧИ НА ЛАБОРАТОРНОЕ ЗАНЯТИЕ

Подгруппа 1
1. Примените изученный алгоритм для пошагового упорядочения по
возрастанию и убыванию элементов следующих одномерных массивов:

Nr. Coloana 1 Coloana 2


1 82, 59, 34, 55, 16, 85, 53, 86, 57, 62 nizdgfysxzxdukwyjnjo
2 39, 10, 85, 28, 66, 70, 79, 32, 19, 15 moyccjtfubudubgrnhoc
3 86, 29, 78, 53, 85, 16, 70, 64, 21, 82 kbhzzztbkcrgtqanaqtm
4 34, 16, 81, 73, 24, 87, 33, 30, 18, 40 ajecaysfplujqyxylgho

2. Дается двумерный массив, расположите элементы на четных


линиях в порядке возрастания, а элементы на нечетных линиях - в
порядке убывания.
3. Дается двумерный массив, расположите элементы в нечетных
столбцах в порядке возрастания, а элементы в четных столбцах - в
порядке убывания.
4. Дается двумерный массив, расположите ее элементы в порядке
возрастания в виде спирали справа и в порядке убывания - в виде
спирали слева. Подробнее см. Таблицу:

Входные данные Выходные данные (в внешний файл)


N=3 Ascendent Descendent
1 3 5 1 2 3 7 8 9
2 4 6 8 9 4 6 1 2
9 8 7 7 6 5 5 4 3
N=3 Ascendent Descendent
A C E A B C G H I
B D F H I D F A B
I H G G F E E D C

5 din 7
Подгруппа 2
1. Примените изученный алгоритм для пошагового упорядочения по
возрастанию и убыванию элементов следующих одномерных массивов:

Nr. Coloana 1 Coloana 2


1 73, 90, 36, 60, 21, 75, 76, 33, 80, 51 hzteqmknemsotleuiahc
2 80, 74, 13, 16, 82, 39, 89, 20, 96, 85 cuuituchxikbrhnqzmjx
3 49, 63, 64, 54, 98, 14, 67, 55, 60, 58 mbkcsmdmxwyxiyrrxzay
4 20, 33, 45, 82, 66, 15, 57, 47, 69, 24 cedlzdytzuoknqeotckf

2. Дается двумерный массив, расположите элементы на четных


линиях в порядке возрастания, а элементы на нечетных линиях - в
порядке убывания.
3. Дается двумерный массив, расположите элементы в нечетных
столбцах в порядке возрастания, а элементы в четных столбцах - в
порядке убывания.
4. Дается двумерный массив, расположите ее элементы в порядке
возрастания в виде спирали справа и в порядке убывания - в виде
спирали слева. Подробнее см. Таблицу:

Входные данные Выходные данные (в внешний файл)


N=3 Ascendent Descendent
1 3 5 1 2 3 7 8 9
2 4 6 6 5 4 6 5 4
9 8 7 7 8 9 1 2 3
N=3 Ascendent Descendent
A C E A B C G H I
B D F F E D F E D
I H G G H I A B C

6 din 7
ДОМАШНЕЕ ЗАДАНИЕ

1. Прочтите n комплексных чисел из файла data.in и два


действительных числа a и b. Запишите в файл data.out в порядке
убывания модули комплексных чисел, не принадлежащих диапазону
[a, b].
2. Упорядочите элементы вектора, содержащего n целых
чисел, в порядке возрастания и убывания без учета нулевых
элементов.
3. Файл text.number.txt содержит не более одной строки,
разделенной пробелом, и не более 100 целых чисел. Напишите
программу, которая считывает числа из файла и отображает в
порядке возрастания отрицательные целые числа, а если их нет,
отображается сообщение «НЕ СУЩЕСТВУЕТ».
4. Прочтите из текстового файла n дробей: в первой строке
записано n, во второй - натуральные числа, соответствующие
числителям, а в третьей - знаменатели. Отображение
сокращаемых дробей в порядке возрастания.

***ДОПОЛНИТЕЛЬНОЕ ЗАДАНИЕ***

1. Выберите алгоритм A (между ShellSort и MergeSort) и


алгоритм B (между QuickSort и HeapSort). Введите некоторые
глобальные переменные, чтобы подсчитать количество
сравнений для алгоритмов A и B. Сравните результаты для
вектора целых чисел длины n = 20.
2. Реализуйте алгоритм (один из ShellSort и MergeSort) для
сортировки вектора из n слов длиной до 4 букв каждое.
Реализуйте алгоритм (один из QuickSort и HeapSort) для
сортировки структуры, где каждая структура представляет
момент времени (int hour, min, sec).
3. Задайте вектор из n целых чисел, и все значения в векторе
находятся в диапазоне от 0 до 1000. Отсортируйте вектор за
время O (n).

7 din 7

Вам также может понравиться