Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/55: Рейтинг темы: голосов - 55, средняя оценка - 4.80
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
1

Пирамидальная сортировка массива

17.03.2015, 19:03. Показов 11075. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Можете скинуть код програмы с пирамидальной сортировкой массива
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.03.2015, 19:03
Ответы с готовыми решениями:

Пирамидальная сортировка массива строк
Хочу сделать пирамидальную сортировку на массиве строк. Сейчас на числах работает, на строках нет...

Пирамидальная сортировка
Подскажите, что не так? В конце лишний раз всегда проходит. а - массив к - количество массива...

Пирамидальная сортировка
Посоветуйте где можно разобраться с пирамидальной сортировкой (сайт или какое то видео на ютубе или...

Пирамидальная сортировка массива
Перевела код из Pascal в Fortran Program Floid; Const n = 7; Type Vector = array of Integer;...

11
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
18.03.2015, 02:22 2
Переделка из википедии
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
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
#define left_child(node) ( (node) * 2 + 1 )
#define right_child(node) ( (node) * 2 + 2 )
 
void swap(int * array, int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}
 
void heap_it(int * array, int length, int root) {
    int leftChild = left_child(root);
    int rightChild = right_child(root);
    int biggest = root;
    
    if ( leftChild < length && array[root] < array[leftChild] )
        biggest = leftChild;
    if ( rightChild < length && array[biggest] < array[rightChild] )
        biggest = rightChild;
    if ( biggest != root ) {
        swap(array, biggest, root);
        heap_it(array, length, biggest);
    }
}
 
void make_heap(int * array, int length) {
    int i = length / 2;
 
    for ( ; i >= 0; --i )
        heap_it(array, length, i);
}
 
void heap_sort(int * array, int count) {
    int last;
    
    make_heap(array, count);
    for ( last = count - 1; last > 0; --last ) {
        swap(array, 0, last);
        heap_it(array, last, 0);
    }
}
 
#define COUNT (20)
 
int main(void) {
    int array[COUNT], i;
    
    srand(time(NULL));
    for ( i = 0; i < COUNT; ++i )
        array[i] = rand() % 100;
    
    printf("Unsorted:\n");
    for ( i = 0; i < COUNT; ++i )
        printf("%02d ", array[i]);
    
    heap_sort(array, COUNT);
    
    printf("\nSorted:\n");
    for ( i = 0; i < COUNT; ++i )
        printf("%02d ", array[i]);
    printf("\n");
    
    return 0;
}
Код
~/cpp/numbers $ gcc -o heap_sort heap_sort.c 
~/cpp/numbers $ ./heap_sort 
Unsorted:
14 20 51 06 60 24 46 81 82 74 59 46 24 47 94 01 37 84 12 53 
Sorted:
01 06 12 14 20 24 24 37 46 46 47 51 53 59 60 74 81 82 84 94 
~/cpp/numbers $
оригинал
Java
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
/**
 * Класс для сортировки массива целых чисел с помощью кучи.
 * Методы в классе написаны в порядке их использования. Для сортировки 
 * вызывается статический метод sort(int[] a)
 *
 */
class HeapSort {
    /**
     * Сортировка с помощью кучи.
     * Сначала формируется куча:
     * @see HeapSort#buildHeap(int[])
     * Теперь максимальный элемент массива находится в корне кучи. Его нужно 
     * поменять местами с последним элементом и убрать из кучи (уменьшить 
     * размер кучи на 1). Теперь в корне кучи находится элемент, который раньше
     * был последним в массиве. Нужно переупорядочить кучу так, чтобы 
     * выполнялось основное условие кучи - a[parent]>=a[child]:
     * @see #heapify(int[], int, int)
     * После этого в корне окажется максимальный из оставшихся элементов.
     * Повторить до тех пор, пока в куче не останется 1 элемент
     * 
     * @param a сортируемый массив
     */
    public static void sort(int[] a) {
        buildHeap(a);
        int length = a.length - 1;
        while (length > 0) {
            swap(a, 0, length);
            heapify(a, length, 0);
            length--;
        }
    }
 
    /**
     * Построение кучи. Поскольку элементы с номерами начиная с a.length / 2 + 1
     * это листья, то нужно переупорядочить поддеревья с корнями в индексах
     * от 0 до a.length / 2 (метод heapify вызывать в порядке убывания индексов)
     * 
     * @param a - массив, из которого формируется куча
     */
    private static void buildHeap(int[] a) {
        for (int i = a.length / 2; i >= 0; i--) {
            heapify(a, a.length, i);
        }
    }
 
    /**
     * Переупорядочивает поддерево кучи начиная с узла i так, чтобы выполнялось 
     * основное свойство кучи - a[parent] >= a[child].
     * 
     * @param a - массив, из которого сформирована куча
     * @param length - размер поддерева
     * @param i - корень поддерева, для которого происходит переупорядочивание
     */
    private static void heapify(int[] a, int length, int i) {
        int l = left(i);
        int r = right(i);
        int largest = i;
        if (l < length && a[i] < a[l]) {
            largest = l;
        } 
        if (r < length && a[largest] < a[r]) {
            largest = r;
        }
        if (i != largest) {
            swap(a, i, largest);
            heapify(a, length, largest);
        }
    }
 
    /**
     * Возвращает индекс правого потомка текущего узла
     * 
     * @param i индекс текущего узла кучи
     * @return индекс правого потомка
     */
    private static int right(int i) {
        return 2 * i + 1;
    }
 
    /**
     * Возвращает индекс левого потомка текущего узла
     * 
     * @param i индекс текущего узла кучи
     * @return индекс левого потомка
     */
    private static int left(int i) {
        return 2 * i + 2;
    }
 
    /**
     * Меняет местами два элемента в массиве
     * 
     * @param a массив
     * @param i индекс первого элемента
     * @param j индекс второго элемента
     */
    private static void swap(int[] a, int i, int j) {
        int temp = a[i];
        a[i] = a[j];
        a[j] = temp;
    }
 
}
1
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
18.03.2015, 14:27  [ТС] 3
а как в этой программе сделать ввод массива с клавиатуры(количество елементов ну и сами елементы)
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
18.03.2015, 16:32 4
Цитата Сообщение от Danteeee Посмотреть сообщение
а как в этой программе сделать ввод массива с клавиатуры
main() слегка подправить
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
#include <stdio.h>
#include <stdlib.h>
 
#define left_child(node) ( (node) * 2 + 1 )
#define right_child(node) ( (node) * 2 + 2 )
 
void swap(int * array, int i, int j) {
    int tmp = array[i];
    array[i] = array[j];
    array[j] = tmp;
}
 
void heap_it(int * array, int length, int root) {
    int leftChild = left_child(root);
    int rightChild = right_child(root);
    int biggest = root;
    
    if ( leftChild < length && array[root] < array[leftChild] )
        biggest = leftChild;
    if ( rightChild < length && array[biggest] < array[rightChild] )
        biggest = rightChild;
    if ( biggest != root ) {
        swap(array, biggest, root);
        heap_it(array, length, biggest);
    }
}
 
void make_heap(int * array, int length) {
    int i = length / 2;
 
    for ( ; i >= 0; --i )
        heap_it(array, length, i);
}
 
void heap_sort(int * array, int count) {
    int last;
    
    make_heap(array, count);
    for ( last = count - 1; last > 0; --last ) {
        swap(array, 0, last);
        heap_it(array, last, 0);
    }
}
 
int main(void) {
    int * array, count, i;
    
    printf("Elements count: ");
    if ( scanf("%d", &count) != 1 || count < 1 ) {
        fprintf(stderr, "Bzzzzzzzzzzzzzz\n");
        return 1;
    }
    if ( ! ( array = malloc(sizeof(int) * count) ) ) {
        fprintf(stderr, "Hitler Kaput!\n");
        return 1;
    }
    for ( i = 0; i < count; ++i ) {
        printf("ARRAY[%d] = ", i);
        if ( scanf("%d", &array[i]) != 1 ) {
            fprintf(stderr, "Bzzzzzzzzzzzzzz\n");
            free(array);
            fprintf(stderr, "Hitler Kaput!\n");
            return 1;
        }
    }
    
    heap_sort(array, count);
    
    printf("----------------------------------------------\n");
    
    for ( i = 0; i < count; ++i )
        printf("ARRAY[%d] = %d\n", i, array[i]);
    
    free(array);
    return 0;
}
0
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
19.03.2015, 23:18  [ТС] 5
1)как в данной програме сделать так чтобы то что я вводил в vvod() было доступным для остальных пунктов
2)как решить данную проблему : отсутствуют экземпляры шаблон функции "HeapSort", соответствующие списку аргументов типы аргументов: (<error-type>, <error-type>)
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
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
#include "stdafx.h"
#include "iostream"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
int vvod(){
 
    printf("Сколько элементов будет в массиве? ");
    //cout << "Введите размер массива" << endl;
    int p = 0; //количество элементов
    int i = 0;
    int j = 0;
    int temp;
    scanf_s("%d", &p);
    //cin >> p;
    int arr[100];
    arr[100] = arr[p];
    //ввод элементов
    for (i = 0; i < p; i++){
        printf("Введите  %d  элемент: ", i);
        //cout << "Введите " << i << " элемент: \n";
        scanf_s("%d", arr + i);
    }
}
template<class T> void SiftDown(T* const heap, int i, int const n)
{   //Просеивает элемент номер i вниз в пирамиде heap.
    //n -- размер пирамиды
 
    //Идея в том, что вычисляется максимальный элемент из трёх:
    //  1) текущий элемент
    //  2) левый потомок
    //  3) правый потомок
    //Если индекс текущего элемента не равен индексу максималь-
    //  ного, то меняю их местами, и перехожу к максимальному
 
    //Индекс максимального элемента в текущей тройке элементов:
    int nMax(i);
    //Значение текущего элемента (не меняется):
    T const value(heap[i]);
 
    while (true)
    { //Рассматривается элемент i и его потомки i*2+1 и i*2+2
        //В начале каждой итерации nMax == i и value == heap[i]
 
        int childN(i * 2 + 1); //Индекс левого потомка
        //Если есть левый потомок и он больше текущего элемента,
        if ((childN < n) && (heap[childN] > value))
            nMax = childN; //  то он считается максимальным
 
        ++childN; //Индекс правого потомка
        //Если есть правый потомок и он больше максимального,
        if ((childN < n) && (heap[childN] > heap[nMax]))
            nMax = childN; //  то он считается максимальным
 
        //Если текущий элемент является максимальным из трёх
        //  (т.е. если он больше своих детей), то конец:
        if (nMax == i) break;
 
        //Меняю местами текущий элемент с максимальным:
        heap[i] = heap[nMax]; heap[nMax] = value;
        //  при этом значение value будет в ячейке nMax,
        //  поэтому в начале следующей итерации значение value
        //  правильно, т.к. мы переходим именно к этой ячейке
 
        //Переходим к изменившемуся потомку
        i = nMax;
 
    };
}
template<class T> void HeapSort(T* const heap, int n)
{   //Пирамидальная сортировка массива heap.
    //  n -- размер массива
 
    //Этап 1: построение пирамиды из массива
    for (int i(n / 2 - 1); i >= 0; --i) SiftDown(heap, i, n);
 
    //Этап 2: сортировка с помощью пирамиды.
    //  Здесь под «n» понимается размер пирамиды
    while (n > 1) //Пока в пирамиде больше одного элемента
    {
        --n; //Отделяю последний элемент
 
        //Меняю местами корневой элемент и отделённый:
        T const firstElem(heap[0]);
        heap[0] = heap[n];
        heap[n] = firstElem;
 
        //Просеиваю новый корневой элемент:
        SiftDown(heap, 0, n);
    }
}
void piramid() {
    HeapSort(arr, p);
    //printf("[");
    cout << "[ ";
    for (int i = 0; i < p; ++i)
        //printf("%d", arr + i);
        cout << arr[i] << " ";
    //printf("]");
    cout << "]" << endl;
 
    system("pause");
 
}
 
int Vibor(){
    for (i = 0; i < p; i++)
 
    {
        for (j = p - 1; j >= i; j--)
            if (arr[j - 1] > arr[j])
            {
                temp = arr[j - 1];
                arr[j - 1] = arr[j];
                arr[j] = temp;
            }
    }
    for (i = 0; i < p; i++)
    {
        printf("%d", arr[i]);
        //cout << a[i] << " ";
    }
 
}
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale(LC_ALL, "Russian");
    printf("-----Сделайте выбор-----\n");
    printf("1. Ввод массива с клавиатуры\n");
    printf("2. Считывание массива с файла(input.txt)\n");
    printf("3. Сортировка массива пирамидальным методом\n");
    printf("4. Сортировка массива методом выбора\n");
    printf("5. Записать результат в файл (output.txt)\n");
    printf("6. Выход из программы\n");
    printf("Ваш выбор: ");
    int input;
    scanf_s("%d", &input);
    switch (input) {
    case 1: vvod();
        break;
    /*case 2:
    {
    }*/
    case 3:
    {
        printf("3. Сортировка массива пирамидальным методом\n");
        piramid();
        break;
    }
    case 4:
    {
        printf("4. Сортировка массива методом выбора\n");
        Vibor();
        break;
    }
    /*case 5:{
    }
    */
    case 6: {
        printf("До свидания");
        break;
    }
    
    default:
        printf("Неправильный ввод.\n");
    }
    return 0;
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
20.03.2015, 02:15 6
Danteeee, Вы разницы между С и С++ принципиально не понимаете? Одним только вводом/выводом дело не ограничивается. Уточните всё-таки, какой язык Вы учите.
0
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
20.03.2015, 12:19  [ТС] 7
с(СИ)
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
20.03.2015, 12:29 8
ТрЫндец...
Danteeee, в си шаблонов нет.
0
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
20.03.2015, 12:38  [ТС] 9
и как это тогда сделать?
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
20.03.2015, 13:09 10
Запилить под конкретный тип.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
20.03.2015, 14:23 11
 Комментарий модератора 
Просил же не плодить одинаковые темы.

Цитата Сообщение от Danteeee Посмотреть сообщение
и как это тогда сделать?
Сразу целиком задание озвучить нельзя было?
Цитата Сообщение от Danteeee Посмотреть сообщение
Можете скинуть код програмы с пирамидальной сортировкой массива
Скинул
Цитата Сообщение от Danteeee Посмотреть сообщение
а как в этой программе сделать ввод массива с клавиатуры(количество елементов ну и сами елементы)
Следующий пост
Теперь
Цитата Сообщение от Danteeee Посмотреть сообщение
как в данной програме сделать так чтобы то что я вводил в vvod() было доступным для остальных пунктов
и код на С++

Графический интерфейс точно не понадобится?
0
0 / 0 / 1
Регистрация: 17.10.2014
Сообщений: 60
20.03.2015, 19:01  [ТС] 12
Цитата Сообщение от easybudda Посмотреть сообщение
Графический интерфейс точно не понадобится?
нет

Добавлено через 4 часа 35 минут
Цитата Сообщение от Danteeee Посмотреть сообщение
1)как в данной програме сделать так чтобы то что я вводил в vvod() было доступным для остальных пунктов
так как мне это сделать?
0
20.03.2015, 19:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2015, 19:01
Помогаю со студенческими работами здесь

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

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

Пирамидальная сортировка(доработка динамичного массива)
Здравствуйте, форумчане! Помогите сделать массив динамичным(задается размер массива) и добавить...

Пирамидальная сортировка массива - найти ошибки в коде
Ошибка в приложенной картинке. Сортировка пирамидой, ошибка в сорте возникает почему-то только при...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru