![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сортировка строк!!!
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]Проверятиь по символьно. Метод пузырька, Шелла и т.д.