Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сортировка строк!!!


SSSSS ©   (2004-07-30 02:20:00) 

НАРОД СКАЖИТЕ ПОЖАЛУЙСТА! - КАК ОТСОРТИРОВАТЬ КУЧУ СТРОК?
И желательно быстро!


SSSSS   (2004-07-30 12:55:00) [1]

Спасибо народ.


Думкин   (2004-07-30 06:29:00) [2]

1. Для сравнения использовать библиотеку QStrings - повышение скорости до 2 раз.
2. Быстрая оптимизированная сортировка, по сравнению со стандартной - увеличение скорости до 1,5 раз. Описана у Бакнелла.


KADAN   (2004-07-30 04:08:00) [3]

>ЮЮ ©   (30.07.04 03:54) [6]

> TStringList, у которого есть метод Sort, причем быстрый
> (QuickSort :)

Хм... и точно... не знал... :)


Gero   (2004-07-30 03:58:00) [4]


> for aa:=1 to 16 do begin
>   for i:=1024 downto 1 do
>   if z[i]>=z[i+1024] then begin a:=z[i];z[i]:=z[i+1024];z[i+1024]:=a;end;
>   for i:=1536 downto 1 do
>   if z[i]>=z[i+512] then begin a:=z[i];z[i]:=z[i+512];z[i+512]:=a;end;
>   for i:=1792 downto 1 do
>   if z[i]>=z[i+256] then begin a:=z[i];z[i]:=z[i+256];z[i+256]:=a;end;
>   for i:=1920 downto 1 do
>   if z[i]>=z[i+128] then begin a:=z[i];z[i]:=z[i+128];z[i+128]:=a;end;
>   for i:=1984 downto 1 do
>   if z[i]>=z[i+64] then begin a:=z[i];z[i]:=z[i+64];z[i+64]:=a;end;
>   for i:=2016 downto 1 do
>   if z[i]>=z[i+32] then begin a:=z[i];z[i]:=z[i+32];z[i+32]:=a;end;
>   for i:=2032 downto 1 do
>   if z[i]>=z[i+16] then begin a:=z[i];z[i]:=z[i+16];z[i+16]:=a;end;
>   for i:=2040 downto 1 do
>   if z[i]>=z[i+8] then begin a:=z[i];z[i]:=z[i+8];z[i+8]:=a;end;
>   for i:=2044 downto 1 do
>   if z[i]>=z[i+4] then begin a:=z[i];z[i]:=z[i+4];z[i+4]:=a;end;
>   for i:=2044 downto 1 do
>   if z[i]>=z[i+4] then begin a:=z[i];z[i]:=z[i+4];z[i+4]:=a;end;
>   for i:=2046 downto 1 do
>   if z[i]>=z[i+2] then begin a:=z[i];z[i]:=z[i+2];z[i+2]:=a;end;
>   for i:=2046 downto 1 do
>   if z[i]>=z[i+2] then begin a:=z[i];z[i]:=z[i+2];z[i+2]:=a;end;
>   for i:=2047 downto 1 do
>   if z[i]>=z[i+1] then begin a:=z[i];z[i]:=z[i+1];z[i+1]:=a;end;
>   for i:=2047 downto 1 do
>   if z[i]>=z[i+1] then begin a:=z[i];z[i]:=z[i+1];z[i+1]:=a;end;end;

Тихий ужас...


ЮЮ   (2004-07-30 03:54:00) [5]

Строки должны находиться в соответствующем хранилище, а не в куче, например, TStringList, у которого есть метод Sort, причем быстрый (QuickSort :)


KADAN   (2004-07-30 02:58:00) [6]

>GanibalLector ©   (30.07.04 02:43) [2]
ты уверен, что это сортировка Шелла?


KADAN   (2004-07-30 02:53:00) [7]

какие еще пузырьковая и шелла? сказано же: БЫСТРО. на это есть быстрая сортировка:

Procedure Quicksort(var x:vector);
Procedure sort(l,r: integer);
Var  i, j: integer;
y, z: String;
Begin
i:=l; j:=r;
y:=x[(l+r) div 2];
repeat
 while x[i]<y do i:=i + 1;
 while x[j]>y do j:=j - 1;
 if i<=j then begin z:=x[i]; x[i]:=x[j]; x[j]:=z
                                  i:=i+1; j:=j-1 end;
until i>j;
if l < j then sort (l, j);
if i < r then  sort(i, r)
end;
sort(1, n)
end;


где vector = array[1..n] of string. думаю для динамического массива переделать не составит труда.


GanibalLector   (2004-07-30 02:45:00) [8]

А еще проще,экспортнуть в базу.Там отсортировать и обратно импортировать.Все.


GanibalLector   (2004-07-30 02:43:00) [9]

вот,кстати...нашел с 1 курса па Паскале.
Метод Шелла:
program psa; {б®авЁа®ўЄ  ?Ґ«« :ба.ўаҐ¬п ўлЇ®«­Ґ­Ёп 39 ¬бҐЄ.}
uses dos,crt;
var a,i,r0,r1,aa:integer;
hour,min,sec,msec:word;
z:array [1..2048] of integer;
begin
  for i:=1 to 2048 do z[i]:=random(999);
  gettime(hour,min,sec,msec);
  r0:=sec*100+msec;
  for aa:=1 to 16 do begin
  for i:=1024 downto 1 do
  if z[i]>=z[i+1024] then begin a:=z[i];z[i]:=z[i+1024];z[i+1024]:=a;end;
  for i:=1536 downto 1 do
  if z[i]>=z[i+512] then begin a:=z[i];z[i]:=z[i+512];z[i+512]:=a;end;
  for i:=1792 downto 1 do
  if z[i]>=z[i+256] then begin a:=z[i];z[i]:=z[i+256];z[i+256]:=a;end;
  for i:=1920 downto 1 do
  if z[i]>=z[i+128] then begin a:=z[i];z[i]:=z[i+128];z[i+128]:=a;end;
  for i:=1984 downto 1 do
  if z[i]>=z[i+64] then begin a:=z[i];z[i]:=z[i+64];z[i+64]:=a;end;
  for i:=2016 downto 1 do
  if z[i]>=z[i+32] then begin a:=z[i];z[i]:=z[i+32];z[i+32]:=a;end;
  for i:=2032 downto 1 do
  if z[i]>=z[i+16] then begin a:=z[i];z[i]:=z[i+16];z[i+16]:=a;end;
  for i:=2040 downto 1 do
  if z[i]>=z[i+8] then begin a:=z[i];z[i]:=z[i+8];z[i+8]:=a;end;
  for i:=2044 downto 1 do
  if z[i]>=z[i+4] then begin a:=z[i];z[i]:=z[i+4];z[i+4]:=a;end;
  for i:=2044 downto 1 do
  if z[i]>=z[i+4] then begin a:=z[i];z[i]:=z[i+4];z[i+4]:=a;end;
  for i:=2046 downto 1 do
  if z[i]>=z[i+2] then begin a:=z[i];z[i]:=z[i+2];z[i+2]:=a;end;
  for i:=2046 downto 1 do
  if z[i]>=z[i+2] then begin a:=z[i];z[i]:=z[i+2];z[i+2]:=a;end;
  for i:=2047 downto 1 do
  if z[i]>=z[i+1] then begin a:=z[i];z[i]:=z[i+1];z[i+1]:=a;end;
  for i:=2047 downto 1 do
  if z[i]>=z[i+1] then begin a:=z[i];z[i]:=z[i+1];z[i+1]:=a;end;end;
  gettime(hour,min,sec,msec);
  r1:=sec*100+msec-r0;
  for i:=1 to 2048  do write (z[i],' ');
  writeln('б®авЁа®ўЄ  ?Ґ««  ўлЇ®«­Ґ­  §  ',r1,' ¬бҐЄ. :');
  readln;readln;
  end.

Метод пузырька:
program psa;
uses dos; {б®авЁа®ўЄ  ¬Ґв®¤®¬ Їг§ламЄ  ба.ўаҐ¬п ўлЇ®«­Ґ­Ёп 247 ¬бҐЄ.}
var bound,t,a,i,x,r0,r1:integer;
z:array [1..2048] of integer;
hour,min,sec,msec:word;
label 1,2;
   begin
  a:=2048;for i:=1 to a do z[i]:=random(999);
  gettime(hour,min,sec,msec);
  r0:=sec*100+msec;
  bound:=a;
1: t:=0;
  if bound=1 then goto 2;
  for i:=1 to bound-1 do
  if z[i]>z[i+1] then begin x:=z[i];z[i]:=z[i+1];z[i+1]:=x;t:=i;end;
2: if t<>0 then begin bound:=t;goto 1;end
  else begin
  gettime(hour,min,sec,msec);
  r1:=sec*100+msec-r0;
  for i:=1 to a do write(z[i],' ');writeln;
  writeln('б®авЁа®ўЄ  ¬Ґв®¤®¬ Їг§ламЄ  ўлЇ®«­Ґ­® §  ',r1,'¬бҐЄ. ');
  readln;readln;end;end.

А вообще,сортирую так :
(тут правда сортировка чисел,а не букв...но принцип тот-же)
procedure TForm1.SpeedButton2Click(Sender: TObject);
var i,ii:integer;
C_name,C_t1,C_t2:string;
begin
for ii:=1 to StringGrid2.rowcount-3 do
for i:=1 to StringGrid2.rowcount-2 do begin
      if StringGrid2.Rowcount-2>=i+1 then begin
        if strtoint(StringGrid2.Cells[2,i])>strtoint(StringGrid2.Cells[2,i+1]) then begin
                                                       C_name:=StringGrid2.cells[1,i];
                                                       C_t1:=StringGrid2.Cells[2,i];
                                                       C_t2:=StringGrid2.cells[3,i];
                 StringGrid2.Cells[1,i]:=StringGrid2.Cells[1,i+1];
                 StringGrid2.Cells[2,i]:=StringGrid2.Cells[2,i+1];
                 StringGrid2.Cells[3,i]:=StringGrid2.Cells[3,i+1];
                                                      StringGrid2.Cells[1,i+1]:=C_name;
                                                      StringGrid2.Cells[2,i+1]:=C_t1;
                                                      StringGrid2.Cells[3,i+1]:=C_t2;
                                                                          end;
                                         end;
                                       end;

///////////////////////////////

for ii:=1 to StringGrid3.rowcount-3 do
for i:=1 to StringGrid3.rowcount-2 do begin
      if StringGrid3.Rowcount-2>=i+1 then begin
        if strtoint(StringGrid3.Cells[3,i])<strtoint(StringGrid3.Cells[3,i+1]) then begin
                                                       C_name:=StringGrid3.cells[1,i];
                                                       C_t1:=StringGrid3.Cells[2,i];
                                                       C_t2:=StringGrid3.cells[3,i];
                 StringGrid3.Cells[1,i]:=StringGrid3.Cells[1,i+1];
                 StringGrid3.Cells[2,i]:=StringGrid3.Cells[2,i+1];
                 StringGrid3.Cells[3,i]:=StringGrid3.Cells[3,i+1];
                                                      StringGrid3.Cells[1,i+1]:=C_name;
                                                      StringGrid3.Cells[2,i+1]:=C_t1;
                                                      StringGrid3.Cells[3,i+1]:=C_t2;
                                                                          end;
                                         end;
                                       end;
end;


-=Iton=-   (2004-07-30 02:27:00) [10]

Проверятиь по символьно. Метод пузырька, Шелла и т.д.


Наверх

Титульная страница Поиск, карта сайта Написать письмо