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

Сортировка двумерного массива методом qsort

15.08.2018, 14:10. Показов 6484. Ответов 10
Метки нет (Все метки)

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
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
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
#include <iostream>
 
using namespace std;
std::string data[][3];
 
int cmp(const void *a, const void *b)
{
    string *arr1 = (string*)a; //{213,321}
    string *arr2 = (string*)b; //{13,999}
    
    return  (arr1< arr2) - (arr2<arr1);
 
    //return (arr1[0] + arr1[1]) < (arr2[0] + arr2[1]) ? -1 : 1;
}
 
int main()
{
    //const int N = 5;
    //
    //int arr[][2] = {
    //  {-213,-321},
    //  {13,999},
    //  {93,123},
    //  {3,1},
    //  {32,12}
    //};
 
    size_t i = 0;
        qsort(data, 200, sizeof(data[i++][0]), cmp);
    
    //std::vector<int> vc = { 23,3214,4536,6547,76,23,23 };
    //auto it = vc.
 
    //sort(vc.begin(), vc.end());
    
    
    
 
    /*for (size_t i = 0; i < N; i++)
    {
        printf("%d %d \n", arr[i][0], arr[i][1]);
    }
    std::cout << std::endl;
*/
    
    for (size_t i = 0; i < 200; i++)
    {
        std::cout << data[i][0].c_str() << "\t" << data[i][1].c_str() << "\t" << data[i][2].c_str()<< "\n";
    }
    system("pause");
    return 0;
}
 
std::string data[][3] = {
        { "x", "67", "16" },
        { "w", "98", "93" },
        { "g", "1", "71" },
        { "p", "21", "3" },
        { "q", "88", "35" },
        { "b", "76", "61" },
        { "w", "83", "25" },
        { "u", "19", "94" },
        { "t", "98", "90" },
        { "w", "6", "79" },
        { "e", "45", "66" },
        { "r", "16", "14" },
        { "s", "55", "94" },
        { "o", "47", "30" },
        { "p", "6", "52" },
        { "e", "5", "59" },
        { "k", "36", "22" },
        { "g", "54", "8" },
        { "h", "38", "98" },
        { "n", "75", "29" },
        { "x", "12", "3" },
        { "b", "3", "62" },
        { "r", "61", "2" },
        { "q", "81", "79" },
        { "g", "39", "6" },
        { "z", "99", "74" },
        { "b", "32", "88" },
        { "s", "50", "1" },
        { "q", "26", "71" },
        { "u", "40", "69" },
        { "a", "70", "93" },
        { "k", "95", "42" },
        { "b", "88", "31" },
        { "w", "79", "44" },
        { "u", "3", "21" },
        { "m", "39", "23" },
        { "a", "46", "51" },
        { "t", "86", "8" },
        { "h", "46", "11" },
        { "r", "53", "85" },
        { "e", "49", "12" },
        { "h", "32", "23" },
        { "y", "54", "39" },
        { "p", "85", "17" },
        { "f", "46", "38" },
        { "a", "47", "21" },
        { "a", "51", "63" },
        { "a", "67", "75" },
        { "b", "38", "17" },
        { "p", "94", "37" },
        { "d", "68", "12" },
        { "k", "9", "90" },
        { "f", "48", "77" },
        { "m", "52", "91" },
        { "m", "25", "71" },
        { "w", "4", "51" },
        { "b", "10", "40" },
        { "o", "52", "67" },
        { "x", "52", "72" },
        { "n", "42", "50" },
        { "w", "92", "55" },
        { "l", "17", "24" },
        { "c", "24", "56" },
        { "r", "29", "6" },
        { "w", "51", "4" },
        { "k", "57", "41" },
        { "x", "93", "51" },
        { "r", "67", "25" },
        { "x", "27", "93" },
        { "f", "45", "49" },
        { "h", "60", "4" },
        { "y", "81", "60" },
        { "y", "68", "6" },
        { "k", "19", "9" },
        { "e", "94", "74" },
        { "h", "39", "6" },
        { "f", "35", "1" },
        { "k", "30", "49" },
        { "z", "55", "41" },
        { "v", "4", "69" },
        { "s", "80", "58" },
        { "r", "67", "83" },
        { "u", "26", "61" },
        { "d", "4", "47" },
        { "t", "48", "21" },
        { "z", "49", "76" },
        { "k", "2", "81" },
        { "o", "26", "87" },
        { "i", "86", "51" },
        { "i", "85", "76" },
        { "o", "8", "23" },
        { "o", "70", "65" },
        { "d", "7", "38" },
        { "x", "14", "12" },
        { "d", "50", "18" },
        { "p", "95", "11" },
        { "j", "35", "32" },
        { "z", "57", "38" },
        { "e", "68", "13" },
        { "t", "58", "31" },
        { "b", "23", "56" },
        { "u", "37", "5" },
        { "b", "7", "62" },
        { "l", "61", "96" },
        { "z", "6", "31" },
        { "w", "30", "23" },
        { "z", "14", "58" },
        { "g", "86", "84" },
        { "r", "21", "96" },
        { "b", "11", "90" },
        { "q", "97", "59" },
        { "c", "42", "28" },
        { "f", "86", "93" },
        { "f", "98", "55" },
        { "x", "72", "53" },
        { "k", "33", "38" },
        { "l", "18", "87" },
        { "i", "15", "36" },
        { "e", "45", "60" },
        { "v", "63", "88" },
        { "s", "78", "9" },
        { "u", "63", "77" },
        { "g", "32", "78" },
        { "b", "9", "6" },
        { "b", "77", "76" },
        { "r", "67", "97" },
        { "q", "74", "98" },
        { "w", "88", "91" },
        { "n", "9", "46" },
        { "d", "90", "5" },
        { "a", "81", "74" },
        { "o", "82", "41" },
        { "a", "7", "52" },
        { "j", "46", "12" },
        { "o", "90", "51" },
        { "z", "8", "24" },
        { "a", "40", "10" },
        { "o", "64", "80" },
        { "z", "15", "36" },
        { "r", "25", "85" },
        { "u", "38", "83" },
        { "i", "95", "93" },
        { "c", "42", "54" },
        { "h", "49", "5" },
        { "x", "48", "72" },
        { "z", "2", "89" },
        { "r", "48", "30" },
        { "a", "90", "49" },
        { "h", "56", "39" },
        { "r", "32", "40" },
        { "r", "3", "12" },
        { "w", "27", "19" },
        { "g", "26", "52" },
        { "c", "35", "60" },
        { "z", "60", "94" },
        { "k", "24", "51" },
        { "z", "98", "36" },
        { "o", "61", "93" },
        { "o", "23", "34" },
        { "i", "34", "44" },
        { "r", "54", "47" },
        { "s", "20", "22" },
        { "n", "53", "24" },
        { "j", "88", "76" },
        { "y", "45", "89" },
        { "d", "85", "24" },
        { "t", "8", "84" },
        { "r", "75", "69" },
        { "v", "12", "69" },
        { "k", "37", "43" },
        { "l", "64", "74" },
        { "g", "60", "13" },
        { "a", "83", "1" },
        { "q", "50", "59" },
        { "m", "62", "51" },
        { "p", "15", "97" },
        { "l", "34", "30" },
        { "f", "29", "26" },
        { "y", "76", "71" },
        { "e", "86", "99" },
        { "j", "13", "92" },
        { "l", "76", "90" },
        { "d", "59", "38" },
        { "j", "19", "36" },
        { "j", "88", "11" },
        { "c", "98", "4" },
        { "y", "46", "25" },
        { "y", "38", "84" },
        { "y", "60", "97" },
        { "z", "8", "24" },
        { "l", "68", "8" },
        { "s", "5", "20" },
        { "z", "81", "32" },
        { "f", "65", "91" },
        { "f", "23", "63" },
        { "n", "41", "59" },
        { "r", "94", "42" },
        { "z", "70", "72" },
        { "d", "23", "74" },
        { "l", "74", "23" },
        { "a", "1", "84" },
        { "u", "72", "12" },
        { "o", "30", "2" },
        { "r", "57", "97" },
        { "d", "4", "13" },
        { "v", "66", "94" },
        { "g", "63", "86" },
        { "z", "88", "64" },
        { "z", "89", "59" },
        { "g", "37", "4" },
        { "n", "47", "45" },
        { "l", "2", "32" },
        { "k", "54", "79" },
        { "b", "52", "28" },
        { "r", "10", "32" },
        { "d", "1", "58" },
        { "m", "51", "68" },
        { "q", "69", "69" },
        { "f", "95", "65" },
        { "p", "20", "41" },
        { "v", "88", "23" },
        { "a", "76", "66" },
        { "x", "19", "41" },
        { "e", "94", "40" },
        { "q", "86", "77" },
        { "p", "42", "38" },
        { "m", "4", "26" },
        { "k", "51", "97" },
        { "n", "55", "77" },
        { "a", "54", "9" },
        { "h", "47", "42" },
        { "r", "72", "59" },
        { "e", "94", "77" },
        { "l", "32", "86" },
        { "i", "71", "99" },
        { "j", "13", "69" },
        { "m", "93", "4" },
        { "g", "52", "39" },
        { "c", "91", "69" },
        { "a", "28", "17" },
        { "j", "33", "23" },
        { "b", "56", "97" },
        { "d", "87", "83" },
        { "p", "4", "74" },
        { "c", "19", "21" },
        { "s", "46", "69" },
        { "m", "64", "30" },
        { "h", "25", "29" },
        { "t", "33", "62" },
        { "a", "4", "6" },
        { "y", "59", "59" },
        { "v", "32", "2" },
        { "o", "40", "7" },
        { "r", "91", "58" },
        { "o", "37", "85" },
        { "e", "22", "67" },
        { "d", "49", "30" },
        { "g", "4", "33" },
        { "b", "60", "97" },
        { "k", "37", "20" },
        { "z", "99", "48" },
        { "j", "3", "41" },
        { "p", "44", "79" },
        { "n", "95", "55" },
        { "t", "49", "1" },
        { "v", "97", "23" },
        { "t", "19", "61" },
        { "v", "67", "11" },
        { "y", "7", "63" },
        { "i", "55", "65" },
        { "g", "70", "56" },
        { "h", "98", "1" },
        { "m", "45", "71" },
        { "y", "78", "87" }
};
Подскажите что не так?! Пожалуйсто
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.08.2018, 14:10
Ответы с готовыми решениями:

Сортировка двумерного массива методом выбора
Создать двумерный массив 5х5. Заполнить случайными числами. Отсортировать выбором в порядке...

Сортировка двумерного массива методом пузырька
создать двумерный массив, заполнить его случайными числами от 1 до 50, отсортировать от...

Сортировка двумерного массива методом выбора
Здравствуйте! В книге С/С++ Павловская, метод выбора показан для одномерного массива таким...

Сортировка двумерного массива методом вставок
Создать программу, сортирующую методом вставок двумерный массив целых чисел. При этом самое...

10
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
15.08.2018, 14:41 2
не так то, что ты пытаешься хранить совершенно разнородные данные в массиве.
не надо так. Как минимум для этого есть структуры.

Добавлено через 9 минут
кстати, насколько я знаю, поправьте если не так, Сишным Qsortom сортировать Си++ строки бесполено, он оператор = не вывзовет из С++, или я не прав?

Добавлено через 5 минут
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
#include <fstream>
#include <iostream>
#include <cstdlib>
//using namespace std;
std::string data[][3];
int cmp(const void *a, const void *b)
{
    std::string *arr1 = (std::string*)a;
    std::string *arr2 = (std::string*)b; 
 
    return  (*arr1< *arr2) ? -1 : 1;
 
}
int main()
{
    size_t i = 0;
    qsort(data, 274, 3*sizeof(std::string), cmp);
 
    for (size_t i = 0; i < 200; i++)
    {
        std::cout << data[i][0].c_str() << "\t" << data[i][1].c_str() << "\t" ;
        std::cout<< data[i][2].c_str() << "\n";
    }
    system("pause");
    return 0;
}
 
std::string data[][3] = {
    { "x", "67", "16" },
1
-1 / 1 / 1
Регистрация: 14.01.2017
Сообщений: 322
15.08.2018, 14:49  [ТС] 3
Kuzia domovenok, почему разнотипные данные в строках что нельзя целые числа хранить?

Добавлено через 2 минуты
Kuzia domovenok, Спасибо большое) А что означает 3*sizeof(std::string) ?
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
15.08.2018, 15:47 4
аффтар, учи что к чему последовательно, а не тупо хватай по верхам.
Кусорт очень старая функция, которая работает на манипулировании укаателями. Для того, чтобы сортировать массивы любых типов до того как появились шаблоны, ей нужно знать указатель на начало массива, размер элемента и их число, чтобы иметь возможность выбирать элемент массива из нетипизированного указателя void*.
Чтобы, например, выбрать iй элемент массива внутри функции, надо сместить указатель от начала на i*sizeof(размер элемента) байт
И сразу говорю, все эти указатели это уже оффтопик, суть в том, что твой код - говно. Кусорт в коде для С++ и стд;;стринг лютое говно.
0
-1 / 1 / 1
Регистрация: 14.01.2017
Сообщений: 322
15.08.2018, 17:20  [ТС] 5
Kuzia domovenok, Спасибо что вы помогли в решении задачи и прояснили, хотя и грубовато, а код дал препод

Добавлено через 1 минуту
Kuzia domovenok, Сказал просто переделать чтобы по первому столбцу сортировало а я не могла понять как работала эта фу-кция.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
15.08.2018, 20:16 6
vfhbf, ну по сути вся переделка будет состоять в том, чтобы указать в функции сортировки трёхкратный размер элемента, чтобы она их выхватывала и обменивала пачками по 3,

а в функции сравнения размер элемента не менять, чтобы на проверку отправляла только по первому из каждой выбранной троицы.
1
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
16.08.2018, 10:56 7
vfhbf, Kuzia domovenok,

Цитата Сообщение от http://eel.is/c++draft/alg.c.library
[ Note: The header <cstdlib> declares the functions described in this subclause. — end note]

C++
1
2
3
4
5
6
void* bsearch(const void* key, const void* base, size_t nmemb, size_t size,
              c-compare-pred* compar);
void* bsearch(const void* key, const void* base, size_t nmemb, size_t size,
              compare-pred* compar);
void qsort(void* base, size_t nmemb, size_t size, c-compare-pred* compar);
void qsort(void* base, size_t nmemb, size_t size, compare-pred* compar);
Effects: These functions have the semantics specified in the C standard library.
Remarks: The behavior is undefined unless the objects in the array pointed to by base are of trivial type.
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
16.08.2018, 14:53 8
rat0r, я в первом же сообщении написал, что не уверен но кажется нельзя сортировать классы. Но у меня не было аргументов против этого. Я думал, что кусорт не умеет в конструкторы, деструкторы и операторы=, однако, взявшись за этот код, я к великому удивлению обнаружил, что кусорт работает, поэтому свои претензии опустил. Я даже намерянно тестировал его со строками значительно разной длины, думая, что бе нормальных конструкторов копирования он уж точно переместит типа большую строку в меньшую и вызовет коррупцию кучи, но на удивления все мои тесты проходились..
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
16.08.2018, 15:29 9
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
взявшись за этот код, я к великому удивлению обнаружил, что кусорт работает
Из одного своего случая ты сделал вывод, что нет UB?

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я даже намерянно тестировал его со строками значительно разной длины
Оно и на коротких валится (так вот устроено short string optimization в libstdc++ (~gcc))
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
#include <fstream>
#include <iostream>
#include <cstdlib>
 
std::string data[][3] = {
        { "x", "67", "16" },
        { "w", "98", "93" },
        { "g", "1", "71" },
        { "p", "21", "3" },
        { "q", "88", "35" },
        { "b", "76", "61" },
        { "w", "83", "25" },
        { "u", "19", "94" },
        { "t", "98", "90" },
        { "w", "6", "79" },
};
 
int cmp(const void *a, const void *b)
{
    std::string *arr1 = (std::string*)a;
    std::string *arr2 = (std::string*)b; 
    
    return  (*arr1< *arr2) ? -1 : 1; 
}
 
int main()
{
    qsort(data, std::size(data), sizeof(data[0]), cmp);
 
    for (size_t i = 0; i < std::size(data); i++)
    {
        std::cout << data[i][0] << "\t" << data[i][1] << "\t" ;
        std::cout<< data[i][2] << "\n";
    }
}
https://wandbox.org/permlink/0xOZzKAscxxE5hH5
Код
*** Error in `./prog.exe': munmap_chunk(): invalid pointer: 0x0000000000604490 ***
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x777e5)[0x7f45ab8887e5]
/lib/x86_64-linux-gnu/libc.so.6(cfree+0x1a8)[0x7f45ab895698]
./prog.exe[0x402cf4]
./prog.exe[0x402b0f]
./prog.exe(_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_destroyEm+0x44)[0x402976]
./prog.exe(_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE10_M_disposeEv+0x36)[0x402794]
./prog.exe(_ZNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEED2Ev+0x18)[0x402662]
./prog.exe[0x4018a5]
/lib/x86_64-linux-gnu/libc.so.6(+0x39ff8)[0x7f45ab84aff8]
/lib/x86_64-linux-gnu/libc.so.6(+0x3a045)[0x7f45ab84b045]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0xf7)[0x7f45ab831837]
./prog.exe[0x401699]
…
0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
16.08.2018, 16:16 10
Цитата Сообщение от rat0r Посмотреть сообщение
Оно и на коротких валится (так вот устроено short string optimization в libstdc++ (~gcc))
говорю же, в моей IDE всё работает. И твой код тоже. Я очень старался найти ошибку и не нашёл
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
16.08.2018, 16:29 11
Лучший ответ Сообщение было отмечено MrGluck как решение

Решение

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
говорю же, в моей IDE всё работает. И твой код тоже.
И что отсюда следует?
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Я очень старался найти ошибку и не нашёл
http://eel.is/c++draft/alg.c.library#3
0
16.08.2018, 16:29
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.08.2018, 16:29
Помогаю со студенческими работами здесь

Сортировка двумерного массива методом вставок по строкам
Помогите, пожалуйста, переделать код для двумерного массива. Думаю, что надо по сути надо добавить...

Сортировка двумерного массива Методом Шелла (по убыванию)
Необходимо написать код программы которая сортирует двумерный массив методом Шелла по убыванию. Я...

Сортировка двумерного массива методом Выбора. Select sort
Задание: Упорядочить каждую строку матрицы по убыванию. Отсортировал пузырьком, а вот &quot;Выбором&quot;...

Сортировка двумерного массива методом вставок с "конфеткой"
Доброго времени суток. Помогите разобраться со следующим заданием (в форуме С мне не помогли):...


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

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