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

MSD-сортировка

15.03.2015, 20:02. Показов 1624. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, разобраться.
Можно ли как-то выводить в этом коде сам процесс сортировки поэтапно?
Если да, то что для этого нужно сделать?
Заранее большое спасибо.

Вот кусок с сортировкой

C++ (Qt)
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
template < typename T >
void CVector < T >::sortMSD()
{
    // используем дополнительный массив
 
    T *b = new T [ _size ], m = arr[ 0 ], exp = 1;
 
    // ищем максимальный элемент
 
    for ( int index = 1; index < _size; index++)
 
        if ( arr[ index ] > m )
 
            m = arr[ index ];
 
 
 
    // доп массив
 
    T *bucket = new T [ _size ];
 
 
 
    // пока выполняется условие, выполняем алгоритм
 
    while ( m / exp > 0 )
 
    {
 
        // зануляем его
 
        for( int index = 0; index < _size; ++index )
 
            bucket[ index ] = 0;
 
 
 
        // увеличиваем счетчики на каждом элементе, если индекс равен тому условию
 
        for( int index = 0; index < _size; index++ )
 
            bucket[ arr[ index ] / exp % 10 ]++;
 
 
 
        // текущий элемент равен сумме себя и предыдущего
 
        for( int index = 1; index < 10; index++ )
 
            bucket[ index ] += bucket[ index - 1 ];
 
 
 
        // идем с конца и вычисляем выражение
 
        for ( int index = _size - 1; index >= 0; index-- )
 
            b[ --bucket[ arr[ index ] / exp % 10 ] ] = arr[ index ];
 
 
 
        // в итоге, результат кладем в массив
 
        for ( int index = 0; index < _size; index++ ) 
 
            arr[ index ] = b[ index ];
    //  cout<<arr[ index ]<<" ";
         
 
 
        // увелиичваем переменную
        
        exp *= 10;  
 
    }
 
    delete []b;
 
    delete []bucket;
 
}
Вот вся прога.

C++ (Qt)
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
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
#include "stdafx.h"
#include <stdlib.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <ctime>
 
using namespace std;
 
template < typename T >
class CVector
{
    public:
        // указатель на массив задаваемого типа
        T *arr;
        // размер и количество элементов, которое может быть максимльным в массиве
 
        size_t _size, _capacity;
    public:
    // конструктор по умолчанию
        CVector();
        // конструктор с параметром- размером массива
        CVector( size_t n );
        // конструктор копий для инициализаии с помощью другого массива
        CVector( const CVector < T > &v );
 
        // деструктор
 
        ~CVector();
 
 
        // поразрядная сортировка
        void sortMSD();
 
        // оператор вывода в поток
 
        friend std::ostream& operator << ( std::ostream &os, const CVector < T > &v )
        {
            // идем по всему вектору и выводим в поток через пробел все элементы
            for( int index = 0; index < v._size; ++index )
                os << v.arr[ index ] << " ";
            // возвращаем измененный поток
            return os;
        }
        void randomGenerate( size_t n );
};
 
 
template < typename T >
 
CVector < T >::CVector()
{
    // пусть выделим массив под 100 элементов
    _capacity = 100;
    // текущий размер массива = 0, т.к. данных еще нет
    _size = 0;
    // выдеяем память под 100
    arr = new T [ _capacity ]; 
} 
 
template < typename T >
CVector < T >::CVector( size_t n )
{
 
    // то же самое, только с заданным числом n 
    _capacity = n;
    _size = 0;
    arr = new T [ _capacity ]; 
}
 
 
 
// конструктор копий
 
template < typename T >
CVector < T >::CVector( const CVector < T > &v )
{
    // инициализируем переменные значеиями из другого объекта
    _capacity = v._capacity;
    _size = v._size;
    arr = new T [ _capacity ];
    // и присваиваем все значения, чтобы объекты совпадали по значениям
    for( int index = 0; index < _size; ++index )
        arr[ index ] = v.arr[ index ];
}
 
 
 
// удаляем из памяти, что выделили
template < typename T >
CVector < T >::~CVector()
{
    delete []arr;
}
 
template < typename T >
void CVector < T >::randomGenerate( size_t n )
{
    std::srand( std::time( 0 ) );
    for( int index = 0; index < n; ++index )
    {
        arr[ index ] = std::rand() % ( 100 );
        _size++;
    }
}
 
// поразрядная сортировка
 
template < typename T >
void CVector < T >::sortMSD()
{
    // используем дополнительный массив
 
    T *b = new T [ _size ], m = arr[ 0 ], exp = 1;
 
    // ищем максимальный элемент
 
    for ( int index = 1; index < _size; index++)
 
        if ( arr[ index ] > m )
 
            m = arr[ index ];
 
 
 
    // доп массив
 
    T *bucket = new T [ _size ];
 
 
 
    // пока выполняется условие, выполняем алгоритм
 
    while ( m / exp > 0 )
 
    {
 
        // зануляем его
 
        for( int index = 0; index < _size; ++index )
 
            bucket[ index ] = 0;
 
 
 
        // увеличиваем счетчики на каждом элементе, если индекс равен тому условию
 
        for( int index = 0; index < _size; index++ )
 
            bucket[ arr[ index ] / exp % 10 ]++;
 
 
 
        // текущий элемент равен сумме себя и предыдущего
 
        for( int index = 1; index < 10; index++ )
 
            bucket[ index ] += bucket[ index - 1 ];
 
 
 
        // идем с конца и вычисляем выражение
 
        for ( int index = _size - 1; index >= 0; index-- )
 
            b[ --bucket[ arr[ index ] / exp % 10 ] ] = arr[ index ];
 
 
 
        // в итоге, результат кладем в массив
 
        for ( int index = 0; index < _size; index++ ) 
 
            arr[ index ] = b[ index ];
    //  cout<<arr[ index ]<<" ";
         
 
 
        // увелиичваем переменную
        
        exp *= 10;  
 
    }
 
    delete []b;
 
    delete []bucket;
 
}
 
 
 
int main() 
 
{
 
    CVector < int > vec( 50 );
 
 
 
    int sizeA;
 
    std::cout << "Size: ";
 
    std::cin >> sizeA;
 
    // создаем объект
 
 
 
    vec.randomGenerate( sizeA );
 
 
 
    // печатаем его
 
    std::cout << vec << std::endl;
 
    // сортируем
 
    vec.sortMSD();
 
    // получаем результат: 1 2 3 4 5 6 7 8 9 10
 
    std::cout << vec << std::endl;
 
//  return 0;
    system("pause");
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.03.2015, 20:02
Ответы с готовыми решениями:

Поразрядная сортировка MSD
Поразрядная сортировка MSD , есть???

Проблемы с поразрядной сортировкой msd
#include &lt;cstdlib&gt; #include &lt;iostream&gt; #include &lt;clocale&gt; using namespace std; int main(int...

MSD-сортировка
Грустная история про MSDSort ... MSD (в моей реализации VBA с учетом всех проблем ограниченности...

MSD сортировка
Нужен рабочий пример МСД сортировки массива не знаю где ее искать

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

Сортировка MSD и посчетом
using System; using System.Collections.Generic; using System.Linq; using System.Text; using...

Поразрядная сортировка MSD в C#
Можете написать код поразрядной сортировки MSD в C#

Visual Basic(MSD-сортировка)
Помогите,пожалуйста,переделать код на язык VBA. function radixSort(int A, int l, int r, int d): ...

Поразрядная сортировка LSD и MSD
Уже 4 день пытаюсь реализовать в CLR WinForm &quot;Поразрядную сортировку LSD и MSD&quot; но увы ни чего не...


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

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