Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 59
1

Написать две функции сортировки массива целых чисел, реализующих заданные алгоритмы сортировки – один из класса квадрат

18.09.2018, 10:50. Просмотров 1177. Ответов 6
Метки нет (Все метки)

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
 #include <stdio.h>
#include "stdafx.h" 
#include "iostream" 
#include <stdlib.h> 
#include <time.h> 
int main()
{
    int sort;
    do
    {
        printf("1- Шейкер сортировка\n");
        printf("2- Пирамидальная сортировка\n");
        printf("0-Выход\n");
        scanf("%i\n", &sort);
        if (sort == 0)
            break;
        switch (sort)
        {
        case 1:
        {
            void shekerSort(double *mass, int count);
            {
                double *mass;
                int count;
                int left = 0, right = count - 1; // левая и правая границы сортируемой области массива
                int flag = 1;  // флаг наличия перемещений
                               // Выполнение цикла пока левая граница не сомкнётся с правой
                               // или пока в массиве имеются перемещения
                while ((left < right) && flag > 0)
                {
                    flag = 0;
                    for (int i = left; i < right; i++)  //двигаемся слева направо
                    {
                        if (mass[i] > mass[i + 1]) // если следующий элемент меньше текущего,
                        {             // меняем их местами
                            double t = mass[i];
                            mass[i] = mass[i + 1];
                            mass[i + 1] = t;
                            flag = 1;      // перемещения в этом цикле были
                        }
                    }
                    right--; // сдвигаем правую границу на предыдущий элемент
                    for (int i = right; i > left; i--)  //двигаемся справа налево
                    {
                        if (mass[i - 1] > mass[i]) // если предыдущий элемент больше текущего,
                        {            // меняем их местами
                            double t = mass[i];
                            mass[i] = mass[i - 1];
                            mass[i - 1] = t;
                            flag = 1;    // перемещения в этом цикле были
                        }
                    }
                    left++; // сдвигаем левую границу на следующий элемент
                }
            }
            int main();
            {
                double m[10];
                // Вводим элементы массива
                for (int i = 0; i < 10; i++) {
                    printf("m[%d]=", i);
                    scanf("%lf", &m[i]);
                }
                shekerSort(m, 10); // вызываем функцию сортировки
                                   // Выводим отсортированные элементы массива
                for (int i = 0; i < 10; i++)
                    printf("%.2lf ", m[i]);
                getchar(); getchar();
                return 0;
            }
            break;
        case 2:
        {
            void siftDown(int *numbers, int root, int bottom);
            {
                int *numbers;
                int root;
                int bottom;
                int maxChild; // индекс максимального потомка
                int done = 0; // флаг того, что куча сформирована
                              // Пока не дошли до последнего ряда
                while ((root * 2 <= bottom) && (!done))
                {
                    if (root * 2 == bottom)    // если мы в последнем ряду, 
                        maxChild = root * 2;    // запоминаем левый потомок
                                                // иначе запоминаем больший потомок из двух
                    else if (numbers[root * 2] > numbers[root * 2 + 1])
                        maxChild = root * 2;
                    else
                        maxChild = root * 2 + 1;
                    // если элемент вершины меньше максимального потомка
                    if (numbers[root] < numbers[maxChild])
                    {
                        int temp = numbers[root]; // меняем их местами
                        numbers[root] = numbers[maxChild];
                        numbers[maxChild] = temp;
                        root = maxChild;
                    }
                    else // иначе
                        done = 1; // пирамида сформирована
                }
            }
            // Функция сортировки на куче
            void heapSort(int *numbers, int array_size);
            {
                int *numbers;
                int array_size;
                // Формируем нижний ряд пирамиды
                for (int i = (array_size / 2) - 1; i >= 0; i--)
                    siftDown(numbers, i, array_size - 1);
                // Просеиваем через пирамиду остальные элементы
                for (int i = array_size - 1; i >= 1; i--)
                {
                    int temp = numbers[0];
                    numbers[0] = numbers[i];
                    numbers[i] = temp;
                    siftDown(numbers, 0, i - 1);
                }
            }
            int main();
            {
                int a[10];
                // Заполнение массива случайными числами
                for (int i = 0; i < 10; i++)
                    a[i] = rand() % 20 - 10;
                // Вывод элементов массива до сортировки
                for (int i = 0; i < 10; i++)
                    printf("%d ", a[i]);
                printf("\n");
                heapSort(a, 10); // вызов функции сортировки
                                 // Вывод элементов массива после сортировки
                for (int i = 0; i < 10; i++)
                    printf("%d ", a[i]);
                printf("\n");
                getchar();
                return 0;
            }
            break;
        default:
            printf("Не выбран ни один из пунктов текстового меню");
            break;
        }
        }
        system("pause");
        return 0;
        }
    }
помогите,пожалуйста, с реализацией меню,вроде всё так,но работать не хочет(
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.09.2018, 10:50
Ответы с готовыми решениями:

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

Написать шаблон функции для сортировки массивов действительных и целых чисел
Заданы элементы массива. Написать шаблон функции для сортировки массивов действительных и целых...

Написать программу сортировки по возрастанию заданного массива целых чисел
Написать программу сортировки по возрастанию заданного массива целых чисел Пожалуйста до завтра...

Написать программу сортировки линейного массива целых чисел методом обмена
Написать программу сортировки линейного массива целых чисел методом обмена. Элементы отсортировать...

6
3160 / 2620 / 698
Регистрация: 25.03.2012
Сообщений: 9,444
Записей в блоге: 1
18.09.2018, 13:35 2
Цитата Сообщение от Anastasia1313 Посмотреть сообщение
switch (sort) {
case 1: {
void shekerSort(double *mass, int count);
Я в таких ситуациях удивляюсь, как вы смогли изобрести далеко не самый простой вид сортировки, но при этом...
делать такие идиотские ошибки в языке С++ !!?
Такое впечатление, что писали не вы, код был просто украден откуда-то и вставлен копипастом. Причём настолько смехотворным копипастом, что копипастил, человек, в принципе с языком не знакомый.
Это ж надо! Функция внутри функции! Явно копипастом сделано!
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 59
18.09.2018, 13:41  [ТС] 3
Естественно, я это писала не сама

Добавлено через 1 минуту
Знаете ли, вуз требует сдачи лабораторных работ, причём просто даётся ТЗ и делайте как хотите. Для меня это вообще новый язык. Не хотите - не помогайте. Каждый выживает как может.
0
138 / 66 / 46
Регистрация: 15.10.2015
Сообщений: 298
18.09.2018, 13:56 4
Цитата Сообщение от Anastasia1313 Посмотреть сообщение
реализующих заданные алгоритмы сортировки
Ну хоть задание напечатайте нормально. Какие алгоритмы Heapsort и Shaker Sort ?
0
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 59
18.09.2018, 14:05  [ТС] 5
Написать две функции сортировки массива целых чисел, реализующих заданные алгоритмы сортировки – один из класса квадратичных алгоритмов, другой из класса быстрых алгоритмов.

Добавлено через 46 секунд
использовать шейкер сортировку и пирамидальную
0
138 / 66 / 46
Регистрация: 15.10.2015
Сообщений: 298
18.09.2018, 15:50 6
Лучший ответ Сообщение было отмечено Anastasia1313 как решение

Решение

Anastasia1313, Примерно так, ну если что подправишь.

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#include <iostream>
#include <random>  
#include <ctime>
#include <iomanip>
 
//-------------------------------------------------------------------------------------------------
void fill_array(int* arr, int size);
void print_array(const int* arr, int size);
void shaker_sort(int* arr, int size);
void down_heap(int* arr, int k, int size);
void heap_sort(int* arr, int size);
//-------------------------------------------------------------------------------------------------
int main()
{
    std::cout << "1 - shaker_sort" << std::endl;
    std::cout << "2 - heap_sort" << std::endl;
    std::cout << "0 - exit" << std::endl;
 
    int choice = 0;
    std::cin >> choice;
 
    while (choice != 0)
    {
        std::cout << "Enter the size of the array: ";
        size_t size = 0;
        std::cin >> size;
 
        int* a = new int[size];
 
        switch (choice)
        {
        case 1:
            fill_array(a, size);
            std::cout << "array = ";
            print_array(a, size);
            std::cout << std::endl;
 
            std::cout << "shaker_sort = ";
            shaker_sort(a, size);
            print_array(a, size);
            std::cout << std::endl;
            break;
        case 2:
            fill_array(a, size);
            std::cout << "array = ";
            print_array(a, size);
            std::cout << std::endl;
 
            std::cout << "heap_sort = ";
            heap_sort(a, size);
            print_array(a, size);
            std::cout << std::endl;
            break;
        default:
            choice = 0;
            std::cout << "exit" << std::endl;
            break;
        }
        std::cin >> choice;
        delete[] a;
    }
    return 0;
}
//-------------------------------------------------------------------------------------------------
void shaker_sort(int* arr, int size)
{
    int left = 0;
    int right = size - 1;
    while (left < right)
    {
        for (size_t i = left; i < right; i++)
        {
            if (arr[i + 1] < arr[i])
            {
                std::swap(arr[i], arr[i + 1]);
            }
        }
        right--;
 
        for (size_t i = right; i > left; i--)
        {
            if (arr[i - 1] > arr[i])
            {
                std::swap(arr[i - 1], arr[i]);
            }
        }
        left++;
    }
}
//-------------------------------------------------------------------------------------------------
void down_heap(int* arr, int k, int size)
{
    int new_elem = arr[k];
    int child = 0;
 
    while (k <= size / 2)
    {
        child = 2 * k;
 
        if (child < size && arr[child] < arr[child + 1])
        {
            child++;
        }
        if (new_elem >= arr[child])
        {
            break;
        }
        arr[k] = arr[child];
        k = child;
    }
    arr[k] = new_elem;
}
//-------------------------------------------------------------------------------------------------
void heap_sort(int* arr, int size)
{
    int temp = 0;
 
    for (int i = size / 2 - 1; i >= 0; --i)
    {
        down_heap(arr, i, size - 1);
    }
 
    for (int i = size - 1; i > 0; --i)
    {
        temp = arr[i];
        arr[i] = arr[0];
        arr[0] = temp;
 
        down_heap(arr, 0, i - 1);
    }
}
//-------------------------------------------------------------------------------------------------
void fill_array(int* arr, int size)
{
    std::mt19937 gen(time(0));
    std::uniform_int_distribution<int> uid(0, 100);
    
    for (size_t i = 0; i < size; i++)
    {
        arr[i] = uid(gen);
    }
}
//-------------------------------------------------------------------------------------------------
void print_array(const int* arr, int size)
{
    for (size_t i = 0; i < size; i++)
    {
        std::cout << arr[i] << ' ';
    }
}
//-------------------------------------------------------------------------------------------------
1
0 / 0 / 0
Регистрация: 25.11.2017
Сообщений: 59
18.09.2018, 15:55  [ТС] 7
Спасибо большое
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.09.2018, 15:55

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Написать программу сортировки линейного массива целых чисел методом обмена
написать программу сортировки линейнего массива целых чисел методом обмена.Элементы отсортировать...

Написать программу сортировки линейного массива целых чисел методом обмена
Написать программу сортировки линейного массива целых чтсел методом обмена.Элементы отсортировать...

Написать программу сортировки массива с помощью алгоритма внешней сортировки
1. Дан текстовый файл, в котором записана последовательность целых чисел. Написать программу...

Сортировки массива целых чисел
Необходимо написать программы сортировок массива(с подсчетом количества сранений и обменов):...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.