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

Неправильно работает сортировка слиянием

04.01.2015, 21:57. Показов 579. Ответов 1
Метки нет (Все метки)

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
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 "stdafx.h"
#include <time.h>
#include <vector>
#include <iostream>
#include <stdexcept>
 
int SIZE = 100000;
struct Arr{
    std::vector<int> mas;
    int hs;
};
 
void Fill(Arr & arr){
    for (size_t i = 0; i < SIZE; ++i)
    {
        int key = rand();
        arr.mas.push_back(key);
    }
}
void ReFill(Arr & arr){
    for (size_t i = 0; i < SIZE; ++i)
    {
        int key = rand();
        arr.mas[i] = key;
    }
}
void PrintArray(Arr & arr) {
    for (size_t i = 0; i < arr.mas.size(); ++i)
    {
        std::cout << arr.mas[i] << "   ";
        if (i % 10 == 0 && i != 0)
        {
            std::cout << std::endl;
        }
    }
}
 
void test(Arr & mas)
{
    for (size_t i = 1; i < mas.mas.size(); ++i) {
        if (!(mas.mas[i - 1] <= mas.mas[i]))
        {
            throw std::exception("Un right sort!!! ERROR!");
        }
    }
}
 
 
 
void MergeSort(Arr & mas, int down, int up);
void testMerge();
int _tmain(int argc, _TCHAR* argv[])
{
    srand(time(NULL));
    Arr mas;
    Fill(mas);
    float fTimeStart;
    float fTimeStop;
    std::cout << "Merge sort : " << std::endl;
    fTimeStart = clock() / (float)CLOCKS_PER_SEC;
    testMerge();
    fTimeStop = clock() / (float)CLOCKS_PER_SEC;
    try {
        test(mas);
    }
    catch (std::exception & e)
    {
        std::cout << std::endl << e.what() << std::endl;
        return 1;
    }
    printf("Time  of working == %f sec\n", fTimeStop - fTimeStart);
    return 0;
}
 
/*
Merge Sort
*/
void Merge(Arr & arr, int left, int right, int middle);
 
void testMerge() {
    Arr mas;
    mas.mas.push_back(2);
    mas.mas.push_back(3);
    mas.mas.push_back(1);
 
    MergeSort(mas, 0, mas.mas.size());
}
void MergeSort(Arr & arr, int left, int right) {
    if (left < right) {
        int middle = (left + right) / 2;
        MergeSort(arr, left, middle);
        MergeSort(arr, middle + 1, right);
        Merge(arr, left, right, middle);
    }
}
 
void Merge(Arr & arr, int left, int right, int middle) {
    int countLeftElement = middle - left;
    int countRightElement = right - middle;
    std::vector<int> leftArray;
    std::vector<int> rightArray;
    int indexLeft = 0;
    int indexRight = 0;
    for (; indexLeft < countLeftElement; ++indexLeft) {
        leftArray.push_back(arr.mas[left + indexLeft]);
    }
    for (; indexRight < countRightElement; ++indexRight) {
        rightArray.push_back(arr.mas[middle + indexRight]);
    }
 
    leftArray.push_back(INT_MAX);
    rightArray.push_back(INT_MAX);
    indexLeft = 0;
    indexRight = 0;
    for (int i = left; i < right; ++i) {
        if (leftArray[indexLeft] <= rightArray[indexRight]) {
            arr.mas[i] = leftArray[indexLeft];
            indexLeft++;
        }
        else {
            arr.mas[i] = rightArray[indexRight];
            indexRight++;
        }
    }
}
 
void printVector(std::vector<int> & vec)
{
    for (int i = 0; i < vec.size(); ++i)
    {
        std::cout << vec[i] << "   ";
    }
}
void print(int * a, int up){
    for (int i = 0; i < up; ++i)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
}
void printSides(std::vector<int> & a, int up, int down) {
    for (int i = down; i < up; ++i)
    {
        std::cout << a[i] << " ";
    }
    std::cout << std::endl;
}
Насколько я понимаю всё происходит из за того что я каким то образом не обрабатываю границу правую , то есть в моём примере число 1, у автора там в псевдокоеде, строка в процедуре merge, не
C++
1
int countLeftElement = middle - left;
а, что то наподобие, ( там просто массивы а у меня vector)
C++
1
int countLeftElement = middle - left+1;
и в той же процедуре merge во втором циле for
там не
C++
1
    leftArray.push_back(arr.mas[left + indexLeft]);
а что то наподобие( там просто массивы а у меня vector)
C++
1
    leftArray.push_back(arr.mas[left + indexLeft - 1]);
Но если я так напишу , у меня будет ошибка "Vector out of range"
Видел, много реализаций готовых, но всё равно не могу понять почему и где я ошибаюсь...
Может кто сталкивался с такой же проблемой при сортировке?
Спасибо за внимание!!!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.01.2015, 21:57
Ответы с готовыми решениями:

Сортировка слиянием неправильно сортирует массив
Есть программа сортировки слиянием. Она непонятным образом сортирует массив из 1000 элементов (или...

Не работает сортировка слиянием
#include&lt;stdio.h&gt; #include&lt;iostream&gt; #define zn 7 int*sort(int array, int min, int max);...

Сортировка слиянием. Моя релизация не всегда корректно работает
Здравствуйте. Помогите найти ошибку, уже который день бьюсь над вопросом. 2- и 3-размерные массивы...

Неправильно работает сортировка
сортирует только первый столбец. в чём беда? заранее спасибо #include &quot;stdafx.h&quot; #include...

1
122 / 24 / 6
Регистрация: 31.12.2014
Сообщений: 164
04.01.2015, 22:13 2
Ну не особо вчитываясь, могу предположить, что должно быть так
C++
1
int countLeftElement = middle - left+1;
А ещё самый первый элемент правой последовательности имеет индекс middle+1, потому должно быть как-то так:
C++
1
        rightArray.push_back(arr.mas[middle + 1 + indexRight]);
P.S. А ещё не очень корректно круто будет работать программа, если в массиве будут int_max - вполне можно выйти за пределы вектора в таком случае.
А ещё можете потом написать ту же сортировку, только не в рекурсивном виде, а в обратную сторону (от мелких отрезков ко всему массиву). Существенно быстрее получится
0
04.01.2015, 22:13
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.01.2015, 22:13
Помогаю со студенческими работами здесь

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

Неправильно работает сортировка с char массивами
Помогите, не работает вторая сортировка.void Sort_salary(List **begin) { List *t = NULL, *t1, *r;...

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

Сортировка Слиянием vs Быстрая Сортировка - что лучше
Народ, помогите разобраться какой из методов сортировки лучше &quot;Сортировка Слиянием&quot; или &quot;Быстрая...

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

Проверьте задачку по циклам, неправильно работает. [думаю что неправильно]
Спасибо что решили зайти. Задание выгладит так: http://*******/PW95p А результат выплнения:...


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

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