C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Сортировка списка или массива
НовыйЧок
Отправлено: 15.05.2006, 11:05


Ученик-кочегар

Группа: Участник
Сообщений: 7



Доброе время суток!

Заранее извиняюсь если вопрос не по теме! Но мне очень нужно понять.

Прошу помощи!

Имеется список, содержащий элементы вида:

6-1-1-1
6-1-1-2
6-1-2-1
6-1-3-2
6-2-1-1
6-3-2-1

необходимо при выводе таких данных сортировать их, как показано выше.

Подскажите пожалуйста как можно реализовать такую сортировку.
Или где можно почитать об этом.

Заранее благодарен!
Konstantine
Отправлено: 15.05.2006, 11:24


Мастер участка

Группа: Модератор
Сообщений: 545



не понял вопроса wink.gif
olegenty
Отправлено: 15.05.2006, 11:32


Ветеран

Группа: Модератор
Сообщений: 2412



если данные строковые, то их надо парсить в числа, сортировать числа, потом привязываться обратно к строкам. если же это строковое представление какких-то числовых данных, то просто сортировать числа, и всё. хоть методом пузырька, хотя перестановки побыстрее будут. а вообще, можно воспользоваться TList/TStringList/etc::Sort, предварительно загнав элемены в соответствующий контейнер, или шаблоном sort, или функцией qsort. вариантов — как грязи.

Отредактировано olegenty — 15/05/2006, 13:05
CyberMind
Отправлено: 15.05.2006, 11:52


Ученик-кочегар

Группа: Участник
Сообщений: 29



Если тебе известны методы сортировки обычного одномерного массива, то достаточно ввести функцию (оператор) сравнения элементов твоего списка (пусть приведенный тобой список упорядочен по возрастанию) и задача свелась к предыдущей. Как ты хранишь свой список?
НовыйЧок
Отправлено: 16.05.2006, 07:38


Ученик-кочегар

Группа: Участник
Сообщений: 7



QUOTE
Если тебе известны методы сортировки обычного одномерного массива, то достаточно ввести функцию (оператор) сравнения элементов твоего списка (пусть приведенный тобой список упорядочен по возрастанию) и задача свелась к предыдущей. Как ты хранишь свой список?


Список хранится в БД (Ассес).В текстовом формате.

В список также могут входить элементы вида:

"6-5" и "6-5-1"

olegenty
Отправлено: 16.05.2006, 10:41


Ветеран

Группа: Модератор
Сообщений: 2412



декомпозиция до атомарности в совокупности с инструкцией order by в select — вот всё, что тебе нужно
CyberMind
Отправлено: 16.05.2006, 11:19


Ученик-кочегар

Группа: Участник
Сообщений: 29



Могу вот, что предложить. Считаем, что исходные данные хранятся в двумерном массиве:
CODE

#include "stdio.h"
...
bool FirstLess(char *firstSTR, char *secondSTR)
{
int a, b, c, d, a1, b1, c1, d1;
sscanf(firstSTR, "%i-%i-%i-%i",&a, &b, &c, &d);
sscanf(secondSTR,"%i-%i-%i-%i",&a1, &b1, &c1, &d1);
if((a<a1)||
(a==a1 && b<b1)||
(a==a1 && b==b1 && c<c1) ||
(a==a1 && b==b1 && c==c1 && d<d1)
) return true;
return false;
}
void Order(char **list,int N)
{
char *tmp;
int i,j;
for(i=0;i<=N-1;i++)
{
for(j=0;j<=N-2-i;j++)
{
if(FirstLess(list[j+1],list[j]))
{
tmp = list[j];
list[j] = list[j+1];
list[j+1] = tmp;
}
}
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
char **list;
list = new char *[8];
for(int i=0;i<8;i++)
list[i] = new char[8];

list[0]= "6-3-2-1<!--POST BOX-->";
list[1]= "6-1-1-1<!--POST BOX-->";
list[2]= "6-5<!--POST BOX-->";
list[3]= "6-1-3-2<!--POST BOX-->";
list[4]= "6-5-1<!--POST BOX-->";
list[5]= "6-1-1-2<!--POST BOX-->";
list[6]= "6-1-2-1<!--POST BOX-->";
list[7]= "6-2-1-1<!--POST BOX-->";
Order(list,8);
AnsiString rez;
for(int i=0;i<8;i++)
rez+= list[i]+AnsiString("\n");
ShowMessage(rez);
for(int i=0;i<8;i++)
delete list[i];
delete[] list;
}

Функция FirstLess будет сравнивать два твоих элемента списка, Order — упорядочивает список по "возрастанию"(можешь оптимизировать сортировку), Button1Click — пример вызова, в массив list я заталкал приведенные тобой элементы в произвольном порядке.
Ух ты! Символ конца строки не проходит, короче там где написано post box был слеш с ноликом smile.gif

Отредактировано CyberMind — 16/05/2006, 11:24
НовыйЧок
Отправлено: 16.05.2006, 12:37


Ученик-кочегар

Группа: Участник
Сообщений: 7



СПАСИБО!!!!!!! Всем за помощь!!!!!!

Особенно CyberMind'у !!!!
Пример очень многое дал понять, даже и не по теме.

Guest
Отправлено: 21.05.2006, 18:11


Не зарегистрирован







QUOTE (НовыйЧок @ 16/05/2006, 12:37)
СПАСИБО!!!!!!! Всем за помощь!!!!!!

Особенно CyberMind'у !!!!
Пример очень многое дал понять, даже и не по теме.

Ребят.
Один из наиболее быстрых методов сортировки — алгоритм Хоара.
Grigoriy
Отправлено: 21.05.2006, 18:13


Мастер участка

Группа: Участник
Сообщений: 381



QUOTE (Guest @ 21/05/2006, 18:11)

Ребят.
Один из наиболее быстрых методов сортировки — алгоритм Хоара.

это мое сообщение

Вернуться в Вопросы программирования в C++Builder