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

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

13.12.2014, 16:45. Показов 616. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет Всем!!! Пытаюсь изучить базовые алгоритмы, вот
пишу пирамидальную сортировку, она работает очень медленно .... Подскажите пожалуйста почему, что я не правильно делаю ?
вот код :
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
#include <string>
#include <sstream>
#include <iostream>
#include <assert.h>
#include <exception>
#include <stdexcept>
#include <algorithm>
#include <time.h>
#include <iomanip>  
#include <math.h>
#include <stdio.h>
 
const int N = 25000000;
 
double a[N];
 
 
void fill(double * arr){
    for (int i = 0; i < N; ++i)
    {
        arr[i] = sin((double)i);
    }
}
 
 
 
int getIndexRightChild(int index) {
    return 2 * index + 1;
}
 
int getIndexLeftChild(int index) {
    return 2 * index + 2;
}
void swapTwoElements(double *arr, int first, int second)
{
    double temp = arr[first];
    arr[first] = arr[second];
    arr[second] = temp;
}
/*
  O(lg(n))
*/
void maxHeapify(double * arr, int index, int heapSize) {
    int indexLeft = getIndexLeftChild(index);  // O(1)
    int indexRight = getIndexRightChild(index); // O(1)
    int largest; // O (1)
    if (heapSize > indexLeft &&  arr[indexLeft] > arr[index]) // O(1)
        largest = indexLeft; // O (1)
    else //O(1)
        largest = index; // O(1)
    if (heapSize > indexRight &&  arr[indexRight] > arr[largest]) // O(1)
        largest = indexRight; // O(1)
    if (largest != index) //O1)
    { 
        swapTwoElements(arr, index, largest); // O(1)
        maxHeapify(arr, largest, heapSize); 
    }
}
 
/*
 
 O(n)
*/
void buildMaxHeap(double * arr, int heapSize){
    int side = floor(heapSize / 2);   // O(1)
    for (int i = side; i > -1; --i)
    {
        maxHeapify(arr, i, heapSize); // O(lg(n))
    }
}
 
 
/*
  O (n * lg(n))
*/
void heapSort(double *arr, int Num){
    int heapSize = Num;  // O(1)
    int size = Num;  /// O(1)
    buildMaxHeap(arr, heapSize);  //O(n)
 
    for (int i = (size - 1); i >= 1; --i) { // O(n)
        swapTwoElements(arr, 0, i);
        heapSize--;
        maxHeapify(arr, 0, heapSize); // O(lg(n))
    }
     
 
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    fill(a);
    float fTimeStart = clock() / (float)CLOCKS_PER_SEC;
    //std::sort(a, a + N);
    heapSort(a, N);
    //mergeSort(a, 0, N);
    float fTimeStop = clock() / (float)CLOCKS_PER_SEC;
    printf("time == %f secund\n", fTimeStop - fTimeStart);
}
Всем спасибо за внимание!!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2014, 16:45
Ответы с готовыми решениями:

Сортировка Шелла и пирамидальная сортировка для символов
Здраствуйте, можете пожалуйста привести пример сортировок шелла и пиромидальной сортировки...

2 сортировки: пирамидальная сортировка и сортировка слиянием
Реализовать два улучшенных алгоритма сортировки. Для каждого алгоритма вычислить показатель...

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

Пирамидальная сортировка
Рассматривая алгоритмы сортировок и пытаясь их адаптировать для сортировки по алфавиту...

4
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
13.12.2014, 17:23 2
Возможно, это потому, что алгоритм предусматривает непоследовательный доступ к элементам, что мешает оптимальному использованию кешей.
1
Модератор
Эксперт С++
13505 / 10756 / 6411
Регистрация: 18.12.2011
Сообщений: 28,711
13.12.2014, 18:30 3
Я бы переписал функцию maxHeapify на нерекурсивную.
Да, и зачем столько инклюдов (нужных только 3):
C++
1
2
3
4
5
6
7
8
9
10
11
//#include <string>
//#include <sstream>
//#include <iostream>
//#include <assert.h>
//#include <exception>
//#include <stdexcept>
//#include <algorithm>
//#include <iomanip>  
#include <time.h>
#include <math.h>
#include <stdio.h>
1
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
13.12.2014, 19:08 4
В maxHeapify рекурсия хвостовая, так что со всеми оптимизациями разница вряд ли будет.
1
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
13.12.2014, 20:20  [ТС] 5
Спасибо вам, за помощь!!!
Видимо, читаю я не внимательно, попытаюсь ещё раз проработать главу про сортировку пирамидальную...
0
13.12.2014, 20:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.12.2014, 20:20
Помогаю со студенческими работами здесь

Пирамидальная сортировка
Здравствуйте! Помогите сделать пирамидальную сортировку, чтобы было так : Индексы : 0, 1, 2, 3, 4,...

Пирамидальная сортировка
Соритровка работает, но при больших значениях очень долго, помогите найти проблему Вообщем...

Пирамидальная сортировка
Вопрос на миллион! Нужно создать пирамидальную сортировку как метод класса. Только на сколько я...

Пирамидальная сортировка
int HeapSort (int *a, int n) { int left = n/2+1, right=n-1, x; while (left&gt;1) sift (a,...


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

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