Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Выбор(будет ли сложно изучать два языка Си и СИ++) http://www.cyberforum.ru/cpp-beginners/thread768058.html
доброго дня. будет ли сложно изучать два языка (Си и СИ++). имею ввиду в том смысле, что в своем учебном заведении мне предстоит изучать язык Си, а мне хотелось бы ко всему этому изучить еще такую вещь как Си++(более основательно, чем си), в связи с этим назрел вопрос: будет ли слишком сложно "переключаться" между этими 2мя языками, и слтшком ли отличаются функции, синтаксис Си и Си++? надеюсь...
C++ Что это значит: *(void**)ReturnValue) = hHeap; ? Вот честно, не могу понять что значит вторая строчка кода: void* ReturnValue = (void*) HeapAlloc((HANDLE) hHeap, HEAP_GENERATE_EXCEPTIONS | HEAP_NO_SERIALIZE | HEAP_ZERO_MEMORY, count + sizeof(void*) ); *((void**)ReturnValue) = hHeap; Если написать: *ReturnValue = hHeap; , то появляется ошибка: "error C2100: недопустимое косвенное обращение". Так чем вышепревиденное извращение с... http://www.cyberforum.ru/cpp-beginners/thread768056.html
C++ Разъясните непонятку по языку c++
1) string в stl - это обертка над *char? 2)char - обычно составляет 1 байт и вмещает в себя acsii-кодировку wchar-t - расширенный char и хранит разные значения в зависимости от компилятора. вопрос: какой мне надо объявить тип, чтобы был UTF-8? (как string в c#). И при этом чтобы он на всех платформах отображал одинаковые символы 3)так-же в разных системах, базовые типы имеют разный...
C++ Напишите функцию, получающую целое значение, которая возвращает число с обращенным порядком цифр
1. Напишите функцию, получающую целое значение, которая возвращает число с обращен-ным порядком цифр. 2. Наибольший общий делитель (НОД) двух целых чисел является самым большим числом, на которое делится каждое из двух чисел. Напишите функцию gcd, которая возвращает наибольший общий делитель двух целых чисел.
C++ Как зашифровать текст из файла шифрованием Цезаря с ключевым словом? http://www.cyberforum.ru/cpp-beginners/thread768032.html
в общем дан текст в файле.Нужно зашифровать его, например, с помощью кода Ascii, и записать в другой файл. нет даже предположений, так как не объяснили даже примерно как это делается. Помогите, пожалуйста.
C++ Напишите программу, которая вводит ряд строк и выводит те из них, которые начинаются с буквы «b» Напишите программу, которая вводит ряд строк и выводит те из них, которые начинаются с буквы «b». подробнее

Показать сообщение отдельно
BuPy7
Нет ТЗ - давай досвидания
 Аватар для BuPy7
747 / 344 / 30
Регистрация: 01.12.2011
Сообщений: 2,036
21.01.2013, 18:13     Пирамидальная сортировка
Данная сортировка меня загнала в ступор. Я не могу её понять до конца. Помогите, пожалуйста.

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

Создаю двоичное дерево по принципу, чтоб i был больше i * 2 и i * 2 + 1.
Далее начинаю сортировку по тому же принципу, как и создавал двоичное дерево, но после каждого шага, я меняю первый элемент с последним.

Где косяк?

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
//main.cpp
#include <iostream>
 
using namespace std;
 
int main()
{
    const int count = 12;                                                       //количество элементов в массиве
    int a[count] = {23, 1, 12, 7, 9876, 9, 5, 8464, 4363498, 6355, 76, 9};      //исходный массив
    for (int i = 0; i != count; i++)                                            //распечатываем
        cout << a[i] << " ";
 
    int CountNoSort = count;                    //количество неотсортированных элементов
    int n = CountNoSort / 2;                    //середина массива
 
    for (int i = 0; i != n; i++)            //создание дерева массива
    {
        int temp = 0;                       //временная переменная
 
        if (((2 * i + 1) < CountNoSort) && (a[i] < a[2 * i + 1]))
        {
            temp = a[i];
            a[i] = a[2 * i + 1];
            a[2 * i + 1] = temp;
        }
 
        if (((2 * i + 2) < CountNoSort) && (a[i] < a[2 * i + 2]))
        {
            temp = a[i];
            a[i] = a[2 * i + 2];
            a[2 * i + 2] = temp;
        }
    }
 
    while (CountNoSort != 1)                                        //сортировка дерева массива
    {
        int temp = 0;                                               //временная переменная
 
        for (int i = 0; i != n; i++)
        {
            if (((2 * i + 1) < CountNoSort) && (a[i] < a[2 * i + 1]))
            {
                temp = a[i];
                a[i] = a[2 * i + 1];
                a[2 * i + 1] = temp;
            }
 
            if (((2 * i + 2) < CountNoSort) && (a[i] < a[2 * i + 2]))
            {
                temp = a[i];
                a[i] = a[2 * i + 2];
                a[2 * i + 2] = temp;
            }
        }
            
        temp = a[0];                                                    //меняем местами
        a[0] = a[CountNoSort - 1];
        a[CountNoSort - 1] = temp;
 
        --CountNoSort;
        n = CountNoSort / 2;
    }
    
    cout << endl;                                                       //распечатываем 
    for (int i = 0; i != count; i++)
        cout << a[i] << " ";
 
    system("pause");
    return 0;
}
P.S. За использования лишних переменных не ругайте. Я знаю про это. Это черновой вариант. Когда заработает, можно будет и допилить до человеческого вида. А пока так =)

Добавлено через 4 минуты
Как я понял, по дебагу, косяк на этапе создания двоичного дерева.

Добавлено через 3 минуты
Так, я уже близок к разгадке. Во-первых, мой код полная хрень. В огонь её. Щас разберусь сам походу, как обычно. Обожаю этот форум. Есть вопрос? Напиши сюда. Ответ сам придёт.

Добавлено через 50 минут
Всё. Разобрался. Спасибо форуму! Ошибкой было то, что я не проверял каждого сына сына.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 16:36. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru