Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Увеличить все четные элементы матрицы на 16, а нечетные элементы увеличить втрое https://www.cyberforum.ru/ cpp-beginners/ thread1387249.html
Данная матрица целых чисел размером 4x4. Увеличить все четные элементы на 16, а нечетные элементы увеличить втрое. Вывести на экран содержимое обработанной матрицы. =)
C++ Замена заданного символа в строке на другой заданный символ (блок-схема)
алгоритм замены заданного символа в строке на другой заданный символ. Помогите нарисовать данный алгоритом. Сама не знаю как рисовать алгоритом.
C++ Перегрузка функций. Переставить элементы между минимальным и максимальным в обратном порядке https://www.cyberforum.ru/ cpp-beginners/ thread1387239.html
Друзья, нужна Ваша помощь. Начали изучать перезагрузку функций. Так как только начал работать с перегрузкой ф-ций возникли проблемы с программой. Помогите пожалуйста, сроки сдачи лабораторной...
C++ MS VS 2013 Ultimate https://www.cyberforum.ru/ cpp-beginners/ thread1387237.html
Скажите пожалуйста, чем принципиально отличается Ультимат-редакция студии от той же Комьюнити? Желательно подробности.
C++ Баг в функции еды, игра змейка (Glut + C++)
Помогите, у меня баг в прогге, не могу сделать нормальную функцию еды для игры типо змейки и проверку делал и так далее... Помогите исправить все баги. #include <iostream> #include <gl\glut.h>...
C++ Вычислить значение выражения по формулам https://www.cyberforum.ru/ cpp-beginners/ thread1387211.html
Нужно создать программу, которая будет выдавать результаты вычисления трех формул \rho =\frac{1}{\sqrt{2*\pi *\sigma }}* {e}^{- \frac{x+m}{sqrt{x*m}}\ q=\frac{\ln(a*x)+x}{b}+\ln (x-b)+a ...
C++ Самый простой, примитивный морской бой Достаточно много исходников уже искал но так и не нашел что нужно нужно как можно проще написать примитивный морской бой 10х10 использовать массивы,указатели после каждого хода чистится консоль... https://www.cyberforum.ru/ cpp-beginners/ thread1387194.html #include <listream>. Std. Endl C++
#include <conio.h> #include <lostream> using std:: cout; using std:: endl; int main() {
C++ Вывести массив, заданный в классе https://www.cyberforum.ru/ cpp-beginners/ thread1387185.html
Нужно что бы выводило тот же массив что в классе описан, а у меня хз что выводит #include "stdafx.h" #include <math.h> #include <iostream> using namespace std; class Set { private: int...
C++ Перехват функций https://www.cyberforum.ru/ cpp-beginners/ thread1387171.html
Я делаю чит для игры, я нашел адрес где вызывается WinApi функция WriteFile которая сохраняет данные в файл конфига игры. Мне надо написать на C++ DLL и сделать так чтобы вместо WriteFile вызывалась...
C++ Найти количество элементов массива, каждый из которых меньше по значению, чем среднее среди элементов
Для заданного массива натуральных чисел найти количество элементов каждый из которых меньше по значению чем среднее среди элементов
C++ 10^6 значные числа For given number N you must output amount of N-digit numbers, such, that last digits of their square is equal to 987654321 Input contains integer number N (1<=N<=10^6) #include <iostream>... https://www.cyberforum.ru/ cpp-beginners/ thread1387160.html
0 / 0 / 0
Регистрация: 03.03.2015
Сообщений: 4
0

Количество обменов и сравнений в HeapSort - C++ - Ответ 7296323

03.03.2015, 23:19. Показов 5343. Ответов 3
Метки (Все метки)

Всем доброго времени суток! Помогите, пожалуйста, разобраться с задачей. Мне нужно подсчитать количество обменов и сравнений в пирамидальной сортировке. Нашел программу (возможно даже здесь, не помню, ее код будет ниже), которая производит сортировку и подсчитывает данные значения. Сортирую я массив элементов типа int, который заполняется случайным образом. Для тестирования я брал размерность 100, 500, 1000 и 5000. Результаты работы программы в прикрепленных файлах.

Для удобства отображу это так :

Размерность К-сто сравнений К-ство обменов
100----------------34040---------------------924
500----------------857254--------------------23351
1000----------------3429339------------------86187
5000----------------85004946-----------------1989531

Насколько я понял (возможно неправильно ), посчитать теоретическую оценку для этих значений (сравнений и обменов), я могу по формуле n*logn. Я знаю что она будет достаточно сильно отличаться от значений в программе, но соотношение К-ство сравнений(в программе) / К-ство сравнений(в теории) и К-ство обменов(в программе) / К-ство обменов(в теории) должно быть относительно постоянным (допускается вроде +/- 10%) независимо от размерности массива. У меня же выходит это соотношение для разных размерностей отличается на порядки:


100: 100*log100 = 200; 924/200=4.62; 34040/200=170.2
500: 500*log500 = 1349.49; 23351/1349.49 = 66.8; 857254/1349.49 = 635.24
Ну вообщем и так далее.

Пожалуйста, можете подсказать в чем проблема: возможно я что-то не так понял или счетчики неправильно стоят (хотя я вроде просмотрел, там по идее все правильно), вообщем не знаю я

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
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>
 
using namespace std;
void iswap(int &n1, int &n2)//обмен
{     
    int temp = n1;
    n1 = n2;
    n2 = temp;
}
 int main(){
    
    FILE *f1,*f2;
    setlocale(0,"");
    srand(time(NULL));  
    puts("Пирамидальная сортировка:\n");{
    int countcompare=0; //счетчик сравнений
    int countswap=0; //счетчик обменов
    int const n = 500;
    int a[n];
    f1=fopen("F:\\before_HeapSort.txt","w");
    fprintf(f1,"Start array [length = %d]: ",n);
    for ( int i = 0; i < n; ++i ) 
    {
        a[i]=rand();
        fprintf(f1,"%d ",a[i]);
    }
    fclose(f1);
 
    for ( int i = 0; i < n; ++i ) 
    cout<<a[i]<<" ";
    
    //-----------сортировка------------//
    
    int sh = 0; //смещение
    bool b = false;
    for(;;)
    {
    b = false;
    for ( int i = 0; i < n; i++ )
    {  
        if( countcompare++,i * 2 + 2 + sh < n )
        {
        if(countcompare++, ( a[i + sh] > /*<*/ a[i * 2 + 1 + sh] ) || ( a[i + sh] > /*<*/ a[i * 2 + 2 + sh] ) )
        {
            if (countcompare++, a[i * 2 + 1 + sh] < /*>*/ a[i * 2 + 2 + sh] )
            {
            iswap( a[i + sh], a[i * 2 + 1 + sh] );countswap++;
            b = true;
            }
            else if (countcompare++, a[i * 2 + 2 + sh] < /*>*/ a[ i * 2 + 1 + sh])
                 {
                     iswap( a[ i + sh], a[i * 2 + 2 + sh]);countswap++;
                     b = true;
                 }
        }
        //дополнительная проверка для последних двух элементов
               
            if( countcompare++,a[i*2 + 2 + sh] < /*>*/ a[i*2 + 1 + sh] )
            {
            iswap( a[i*2+1+sh], a[i * 2 +2+ sh] );countswap++;
                        b = true;
            }
        }
        else if( countcompare++,i * 2 + 1 + sh < n )
             {
                 if( countcompare++,a[i + sh] > /*<*/ a[ i * 2 + 1 + sh] )
                 {
                     iswap( a[i + sh], a[i * 2 + 1 + sh] );countswap++;
                     b = true;
                 }
             }
    }
    if (!b) sh++; //смещение увеличивается, когда на текущем этапе
              //сортировать больше нечего
    if ( sh + 2 == n ) break;
    }  //конец сортировки
 
 
    
    puts("\n\nПосле сортировки:\n");
    f2=fopen("F:\\after_HeapSort.txt","w");
    fprintf(f2,"Сравнений: %d\n",countcompare);
    fprintf(f2,"Обменов: %d\n",countswap);
    fprintf(f2,"Sort array [length = %d]: ",n);
    for ( int i = 0; i < n; ++i ) 
    {
        cout << a[i] << " ";
        fprintf(f2,"%d ",a[i]);         
    }
    cout << endl << endl;
    cout<<"\nРазмерность: "<<n;
    cout<<"\nСравнений:"<<countcompare;
    cout<<"\nОбменов"<<countswap<<endl;
    fclose(f2);
    
    
    }
    
    getch();
    return 0;
}


Вернуться к обсуждению:
Количество обменов и сравнений в HeapSort C++
Миниатюры
Количество обменов и сравнений в HeapSort   Количество обменов и сравнений в HeapSort   Количество обменов и сравнений в HeapSort  

Количество обменов и сравнений в HeapSort  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.03.2015, 23:19
Готовые ответы и решения:

Сортировка вставками: количество сравнений и обменов
реализация сортировки вставками где поставить счетчики сравнения и обменов ? вот код: //...

Быстрая сортировка: посчитать количество сравнений и обменов
помогите, пожалуйста ) нужно посчитать количество сравнений и обменов в алгоритме &quot;быстрой&quot;...

Отсортировать 5 массивов пирамидальной сортировкой и подсчитать количество сравнений и обменов
Отсортировать массивы h1,h2,h3,h4,h5 с помощью пирамидальной сортировки и подсчитать количество...

Как теоретически (не программно) посчитать количество сравнений и обменов в пузырьковой сортировке?
как теоретически посчитать количество сравнений и обменов в пузырьковой сортировке?не программно

3
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.03.2015, 23:19
Помогаю со студенческими работами здесь

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

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

Для челночной сортировки определить количество сравнений и обменов
Челночная сортировка. Размерность сортируемого массива: n = 10, n = 50, n = 250. Для...

Как посчитать количество обменов и сравнений при сортировке слиянием?
Дан массив: 33 66 82 85 15 17 74 слияние происходит насколько я погимаю так: 66 33 85 82 17 15 74...

0
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru