Сортировка двумерного массива
- Войдите на сайт для отправки комментариев
Дан массив [28][5], он состоит из целых чисел.
Например
1 | 0,3,9,10,1 |
2 | 1,5,10,10,1 |
3 | 1,5,15,0,0 |
4 | 0,6,3,30,0 |
5 | 2,0,21,20,1 |
Чтобы понять что мне нужно легче объяснить что эти числа из себя представляют. Сортировать нужно порядок следования строк, внутри этих строк ничего менять нельзя.
Результат сортировки положить в такой же массив.
Первое число это номер от 0 до 3 и они могут повторятся (в этом столбце). Первая сортировка это сортировка строк так чтобы строки с меньшим числом оказались наверху. Возрастание.
Следущие 3 числа это день (от 0 до 6), час (от 0 до 23), минута (от 0 до 59). Последняя цифра не важна.
Суть такова что строки нужно выстроить в последовательности по возрастанию сначала по первому столбцу. На основе полученных результатов выполнить сортировку по возрастанию для второго столбца, потом так же для третьего и четвертого. Самое важное условие - для каждой следующей сортировки сохранять порядок результатов предыдущей.
Короче нужно условно выражаясь выстроить строки в порядке хода времени для каждой из цифр первого столбца.
Скажите это вообще реально? Если кто-то готов взяться то напишите пожалуйста мне на почту wild_z@mail.ru
Ах да. Среда - Ардуино ИДЕ. Если это важно.
Бюджет ?
1
0,3,9,10,1
2
3
0,6,3,30,0
4
5
1,5,10,10,1
6
7
1,5,15,0,0
8
9
2,0,21,20,1
вот так ?
Курсовая?
условно говоря , каждая строчка - отметка времени(timestamp)
первая цифра месяц, вторая день, третья час. четвертая минута.
Переводим все четыре цифры в минуты - в итоге многомерная сортировка вырождается в одномерную по одному параметру. Задача элементарная. алгоритм сортировки можно взять любой из учебника.
Дизель, с вас 300 руб за разработку идеи.
кончай говниться, коллеги! Завтра протрезвею и днем накатаю сюда. Стыдно за сортировку бабки брать! Черти в аду котел заведут с несортированными дровами!
кончай говниться, коллеги! Завтра протрезвею и днем накатаю сюда.
ты опоздал, я уже все решил. А примерчик из учебника на сортировку пузырьком ТС и сам найдет
Да, спасибо, мне тоже подсказали перевести время в секунды. А это все упрощает. Сорян, что потратил ваше время. Задача оказывается была проще чем я думал.
01
#define SIZE 5
02
03
uint8_t
in
[][SIZE]={
04
{0,3,9,10,1},
05
{1,5,10,10,1},
06
{1,5,15,0,0},
07
{0,6,3,30,0},
08
{2,0,21,20,1},
09
};
10
11
uint8_t
out
[5][SIZE]={0};
12
13
void
printMass(uint8_t mass[][SIZE],uint8_t size){
14
for
(uint8_t i=0;i<size;i++){
15
Serial
.print(mass[i][0]);
16
for
(uint8_t j=1;j<SIZE;j++){
17
Serial
.print(
','
);
18
Serial
.print(mass[i][j]);
19
}
20
Serial
.println();
21
}
22
}
23
24
// перевод времени в минуты
25
uint32_t getTime(uint8_t pr, uint8_t d, uint8_t h, uint8_t m){
26
return
(44640UL*pr)+(1440*d)+(60*h)+m;
27
}
28
29
void
setup
() {
30
Serial
.begin(115200);
31
Serial
.println(
"IN:"
);
32
printMass(
in
,SIZE);
33
uint8_t p[SIZE]={0};
// признак сортировки
34
for
(uint8_t i=0;i<SIZE;i++){
// подготовка данных
35
p[i]=i;
36
}
37
// Сортировка массива пузырьком
38
for
(uint8_t i = 0; i < SIZE - 1; i++) {
39
for
(uint8_t j = 0; j < SIZE - i - 1; j++) {
40
if
(getTime(
in
[p[j]][0],
in
[p[j]][1],
in
[p[j]][2],
in
[p[j]][3]) >
41
getTime(
in
[p[j+1]][0],
in
[p[j+1]][1],
in
[p[j+1]][2],
in
[p[j+1]][3])) {
42
p[j]^= p[j + 1]; p[j+1]^= p[j]; p[j]^= p[j + 1];
43
}
44
}
45
}
46
// заполняем выходной массив
47
for
(uint8_t i=0;i<SIZE; i++){
48
memcpy(
out
[i],
in
[p[i]],
sizeof
(
in
[0]));
49
}
50
Serial
.println(
"OUT:"
);
51
printMass(
out
,SIZE);
52
}
53
54
void
loop
() {
55
//...
56
}
Дизель, с вас 300 руб за разработку идеи.
Тебе придется поделиться со мной. Как вы много написали пока я скетч рисовал.
а чо, нынче qsort() насовсем отменили?
qsort памяти жреть очень много, эта простейшая программа вешает 4к, на Атмеге8 шибко и не применишь, :-)
Убейбох, не вижу в первом сапщении ни одного упоминания Atmega8
тагда применишь. Но всё равно жрёт многа
Учитывая, что результаты будут уходить в другой массив, все делается элементарно с помощью memcpy()
функция memcpy() не проверяет соответствие размера выходного буфера количеству копируемых байт. В результате совершается достаточно много ошибок, способных привести к переполнению буфера.
функция memcpy() не проверяет соответствие размера выходного буфера количеству копируемых байт. В результате совершается достаточно много ошибок, способных привести к переполнению буфера.
В данном случае размеры массива заданы конкретные.
qsort памяти жреть очень много
Чушь
Спасибо, brokly
Я решил упростить себе задачу и просто ввел еще один элемент массива, в который будет записываться сумма секунд. По ней и будет происходить сортировка. Это слегка ускорит процесс, потому что не потребуется столько операций перемножения.
Спасибо, brokly
Я решил упростить себе задачу и просто ввел еще один элемент массива, в который будет записываться сумма секунд. По ней и будет происходить сортировка. Это слегка ускорит процесс, потому что не потребуется столько операций перемножения.
Можно ещё проще сделать.
Взять текущее время и включать реле по модулю.
currentTime%setTime<60?digitalWrite(RELE2,HIGH):digitalWtite(RELE2,LOW);
Где currentTime время UT в секундах, а setTime- время в секундах когда нужно включать
Я делаю это по расписанию. Что собственно и представляет из себя этот массив.
Я делаю это по расписанию. Что собственно и представляет из себя этот массив.
Так и будет по расписанию:
for(int i=0;i< array_size;i++){
А тут все тоже самое, только в качестве setTime берется член массива.
}
Сортировка мне нужна для отображения ее на web интерфейсе. Для наглядности.
Дан массив [28][5], он состоит из целых чисел.
Например
1
0,3,9,10,1
2
1,5,10,10,1
3
1,5,15,0,0
4
0,6,3,30,0
5
2,0,21,20,1
Чтобы понять что мне нужно легче объяснить что эти числа из себя представляют. Сортировать нужно порядок следования строк, внутри этих строк ничего менять нельзя.
Результат сортировки положить в такой же массив.
Первое число это номер от 0 до 3 и они могут повторятся (в этом столбце). Первая сортировка это сортировка строк так чтобы строки с меньшим числом оказались наверху. Возрастание.
Следущие 3 числа это день (от 0 до 6), час (от 0 до 23), минута (от 0 до 59). Последняя цифра не важна.
Суть такова что строки нужно выстроить в последовательности по возрастанию сначала по первому столбцу. На основе полученных результатов выполнить сортировку по возрастанию для второго столбца, потом так же для третьего и четвертого. Самое важное условие - для каждой следующей сортировки сохранять порядок результатов предыдущей.**
Короче нужно условно выражаясь выстроить строки в порядке хода времени для каждой из цифр первого столбца. ***
Скажите это вообще реально? Если кто-то готов взяться то напишите пожалуйста мне на почту wild_z@mail.ru
** По моему после первой сортировки все последующие уже не актуальны...
*** Если после первой сортировки, последующие проводить отдельно в каждом полученном блоке, то актуальным будет только первый результат.
** По моему после первой сортировки все последующие уже не актуальны...
*** Если после первой сортировки, последующие проводить отдельно в каждом полученном блоке, то актуальным будет только первый результат.
Первая сортировка, массивов по значению первой ячейки.
Вторая сортировка по значению второй ячейки, но только тех значений, у которых первый член равен самому мелкому. И тд
а чо, нынче qsort() насовсем отменили?
А оно упростило бы нам жизнь ?
Кстати не правильно отсортировалось. По первому числу сортировка не важна. Главное 3 числа по середине.
Да и упростим задачку. Просто добавим в конец каждой строки еще одно число sum = дни * 1440 + часы * 60 + минуты и будем сортировать строчки по нему.
Да и упростим задачку. Просто добавим в конец каждой строки еще одно число sum = дни * 1440 + часы * 60 + минуты и будем сортировать строчки по нему.
это это заказ - то озвучьте цену. А если нет - то вам уже столько советов надавали. что могли бы и сами сделать.
Еще одна переменная, на мой взгляд. нафик не нужна. Можно вычислять в процессе, контроллеру все равно заняться нечем
И, кстати, где наш с брокли гонорар?
А лучше поставь библиотеку Time.h, переведи все в UnixTime и работай с ним
Первое число это номер от 0 до 3 и они могут повторятся (в этом столбце). Первая сортировка это сортировка строк так чтобы строки с меньшим числом оказались наверху. Возрастание.
А, понял, не вопрос.
01
#define SIZE 5
02
03
uint8_t
in
[][SIZE]={
04
{0,3,9,10,1},
05
{1,5,10,10,1},
06
{1,5,15,0,0},
07
{0,6,3,30,0},
08
{2,0,21,20,1},
09
};
10
11
uint8_t
out
[5][SIZE]={0};
12
13
void
printMass(uint8_t mass[][SIZE],uint8_t size){
14
for
(uint8_t i=0;i<size;i++){
15
Serial
.print(mass[i][0]);
16
for
(uint8_t j=1;j<SIZE;j++){
17
Serial
.print(
','
);
18
Serial
.print(mass[i][j]);
19
}
20
Serial
.println();
21
}
22
}
23
24
// перевод времени в минуты
25
uint32_t getTime(uint8_t pr, uint8_t d, uint8_t h, uint8_t m){
26
return
(44640UL*(31-pr))+(1440*d)+(60*h)+m;
27
}
28
29
void
setup
() {
30
Serial
.begin(115200);
31
Serial
.println(
"IN:"
);
32
printMass(
in
,SIZE);
33
uint8_t p[SIZE]={0};
// признак сортировки
34
for
(uint8_t i=0;i<SIZE;i++){
// подготовка данных
35
p[i]=i;
36
}
37
// Сортировка массива пузырьком
38
for
(uint8_t i = 0; i < SIZE - 1; i++) {
39
for
(uint8_t j = 0; j < SIZE - i - 1; j++) {
40
if
(getTime(
in
[p[j]][0],
in
[p[j]][1],
in
[p[j]][2],
in
[p[j]][3]) >
41
getTime(
in
[p[j+1]][0],
in
[p[j+1]][1],
in
[p[j+1]][2],
in
[p[j+1]][3])) {
42
p[j]^= p[j + 1]; p[j+1]^= p[j]; p[j]^= p[j + 1];
43
}
44
}
45
}
46
// заполняем выходной массив
47
for
(uint8_t i=0;i<SIZE; i++){
48
memcpy(
out
[i],
in
[p[i]],
sizeof
(
in
[0]));
49
}
50
Serial
.println(
"OUT:"
);
51
printMass(
out
,SIZE);
52
}
53
54
void
loop
() {
55
//...
56
}
Как говориться "найди три отличия".
и перевести надо еще до вкладывания в массив, хранить в нем часы и минуты отдельно совершенно лишнее
Он хочет в веб интерфейсе это показывать. Поэтому задача не облегчается, данные все равно туда сюда конвертить. И память не экономится. Так что наверное большого смысла нет.
brokly Извиняюсь, за то что криво написал. Так получается что все ок.
b707 Я знаю, что уже охамел. =) Но это я уже побольшей части так для себя пишу ....в космос.
чтобы строки с меньшим числом оказались наверху.
А, понял, не вопрос.
1
что-то ты как-то не так понял....
что-то ты как-то не так понял....
Да нет, как раз задача мутно поставлена, он хочет, что бы сортировка по первой ячейке была "по убыванию", а по времени по возрастанию. У него первая ячейка это какой то признак, а не день.
Верно первое число это номер релюхи и оно само сортируется на веб страничке...
Верно первое число это номер релюхи и оно само сортируется на веб страничке...
Так если на веб морде включена сортировка по первой ячейке, то у тебя последовательность разрушится. Если конечно сортировка не по убыванию.
Ну точнее скажем так что там не происходит сортировка. Там данные разбираются по этому числу. А так как разбор идет по порядку от 0 до 29, то данные будут представлены в отсортированном виде и упорядоченно согласно времени от самого раннего до позднего события..
Да нет, как раз задача мутно поставлена, он хочет, что бы сортировка по первой ячейке была "по убыванию", а по времени по возрастанию. У него первая ячейка это какой то признак, а не день.
Так... начинается типичное "потреблятство" - "пиджак хорош, но нельзя ли чуть-чуть изменить цвет"...
Брокли, я бы на твоем месте ничего бы ему не давал, пока не договоритесь о цене.
Не, я и не прошу. Я не хочу лезть на рожон. Брукли и так если честно поступил очень благородно. Дело в том что я описал даже не конкретно под свою задачу, а в общих чертах. Так что даже тот алгоритм что дал Брукли мне придется слегка адаптировать под себя. А вот если уже не будет получаться то я попрошу у Брукли имейл и думаю там мы уже договоримся.
Да Брукли, извините, пожалуйста, но кстати все равно не верно:
А вот если уже не будет получаться то я попрошу у Брукли имейл и думаю там мы уже договоримся.
напомню, что ты изначально разместил тему в платном разделе. Брукли уже написал код и я не вполне понимаю, почему оплата его труда зависит от каких-то "если"...
Решать, конечно, Брукли... но как клиент ты ведешь себя некрасиво.
Брукли уже написал код и я не вполне понимаю, почему оплата его труда зависит от каких-то "если"...
Извините но сделки не было. Не было оговрены условия. Брукли проявил инициативу.
А чё, qsort уже выбросили из стандартной библиотеки?
http://arduino.ru/forum/ishchu-ispolnitelya/sortirovka-dvumernogo-massiv...
Да какая цена :) Дракула прав, за сортировку деньги брать стремно.
Да какая цена :) Дракула прав, за сортировку деньги брать стремно.
ну я за то, чтобы это был твой выбор :) А не нахальство со стороны клиента :)
01
#define SIZE 5
02
03
uint8_t
in
[][SIZE]={
04
{0,3,9,10,1},
05
{1,5,10,10,1},
06
{1,5,15,0,0},
07
{0,6,3,30,0},
08
{2,0,21,20,1},
09
};
10
11
uint8_t
out
[5][SIZE]={0};
12
13
void
printMass(uint8_t mass[][SIZE],uint8_t size){
14
for
(uint8_t i=0;i<size;i++){
15
Serial
.print(mass[i][0]);
16
for
(uint8_t j=1;j<SIZE;j++){
17
Serial
.print(
','
);
18
Serial
.print(mass[i][j]);
19
}
20
Serial
.println();
21
}
22
}
23
24
// перевод времени в минуты
25
uint32_t getTime(uint8_t d, uint8_t h, uint8_t m){
26
return
(1440*d)+(60*h)+m;
27
}
28
29
void
setup
() {
30
Serial
.begin(115200);
31
Serial
.println(
"IN:"
);
32
printMass(
in
,SIZE);
33
uint8_t p[SIZE]={0};
// признак сортировки
34
for
(uint8_t i=0;i<SIZE;i++){
// подготовка данных
35
p[i]=i;
36
}
37
// Сортировка массива пузырьком
38
for
(uint8_t i = 0; i < SIZE - 1; i++) {
39
for
(uint8_t j = 0; j < SIZE - i - 1; j++) {
40
if
(getTime(
in
[p[j]][1],
in
[p[j]][2],
in
[p[j]][3]) >
41
getTime(
in
[p[j+1]][1],
in
[p[j+1]][2],
in
[p[j+1]][3])) {
42
p[j]^= p[j + 1]; p[j+1]^= p[j]; p[j]^= p[j + 1];
43
}
44
}
45
}
46
// заполняем выходной массив
47
for
(uint8_t i=0;i<SIZE; i++){
48
memcpy(
out
[i],
in
[p[i]],
sizeof
(
in
[0]));
49
}
50
Serial
.println(
"OUT:"
);
51
printMass(
out
,SIZE);
52
}
53
54
void
loop
() {
55
//...
56
}
А чё, qsort уже выбросили из стандартной библиотеки?
http://arduino.ru/forum/ishchu-ispolnitelya/sortirovka-dvumernogo-massiva#comment-581854
Нате вам за это каку:
01
uint32_t getTime(uint8_t* d){
02
return
(1440**(++d++))+(60**(d++))+*d;
03
}
04
05
void
setup
() {
06
Serial
.begin(115200);
07
Serial
.println(
"IN:"
);
08
printMass(
in
,SIZE);
09
10
qsort(
in
,SIZE,
sizeof
(
in
[0]),[](
const
void
*x,
const
void
*y)->
int
{
11
return
getTime((uint8_t*)x)>getTime((uint8_t*)y)?1:-1;
12
});
13
14
Serial
.println(
"OUT:"
);
15
printMass(
in
,SIZE);
16
}
Нате вам за это каку:
01
uint32_t getTime(uint8_t* d){
02
return
(1440**(++d++))+(60**(d++))+*d;
03
}
04
05
void
setup
() {
06
Serial
.begin(115200);
07
Serial
.println(
"IN:"
);
08
printMass(
in
,SIZE);
09
10
qsort(
in
,SIZE,
sizeof
(
in
[0]),[](
const
void
*x,
const
void
*y)->
int
{
11
return
getTime((uint8_t*)x)>getTime((uint8_t*)y)?1:-1;
12
});
13
14
Serial
.println(
"OUT:"
);
15
printMass(
in
,SIZE);
16
}
О! Приятно посмотреть!
Тока это ... чё функция сравнения ноль-то не ворочает, когда равны? Никашерна! :-)
Вот еще :) На самом деле она ничего не возвращает . Она просто не компилится.
1
return
(1440**(d+1))+(60**(d+2))+*(d+3);
Так надо курить.