Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.08.2009, 20:10   #1
zver777
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 89
По умолчанию Как быстро перемешать строки?

Мне надо перемешать строки. Использовал следующий код.
Код:
Цитата:
p:=richedit1.Lines.Count;
for g:=0 to p do
begin
randomize;
i:=random(richedit1.Lines.Count);
richedit2.Lines.Add(richedit1.Lines[i]);
richedit1.Lines.Delete(i);
Но работает слишком долго. Мне надо будет перемешивать файлы с большим количеством строк(от 1 до 500000 строк).
Не подскажете код, работающий быстрее или вообще другой метод перемешки?
zver777 вне форума Ответить с цитированием
Старый 23.08.2009, 20:13   #2
Вавел из ГМТУ
Форумчанин
 
Регистрация: 19.06.2009
Сообщений: 896
По умолчанию

Вынеси Randomize из цикла... Randomize Нужно вызывать всего один раз.
Вавел из ГМТУ вне форума Ответить с цитированием
Старый 23.08.2009, 20:16   #3
zver777
Пользователь
 
Регистрация: 31.07.2009
Сообщений: 89
По умолчанию

Цитата:
Сообщение от Вавел из ГМТУ Посмотреть сообщение
Вынеси Randomize из цикла... Randomize Нужно вызывать всего один раз.
Вынес. Но скорости не прибавилось(
zver777 вне форума Ответить с цитированием
Старый 23.08.2009, 20:21   #4
BaronTreep
Форумчанин
 
Регистрация: 29.05.2009
Сообщений: 320
По умолчанию

Не занимать время удаление строки. Кстати, у вас не "перемешка", т.е. не сортировка - просто случайные строки n раз копируете, некоторые строки продублируются, другие потеряются. Ищете по ключевым словам "случайная сортировка". гугль.
BaronTreep вне форума Ответить с цитированием
Старый 23.08.2009, 20:29   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Вавел из ГМТУ, +1

и ещё, неверно for g:=0 to p do
цикл должен быть до richedit1.Lines.Count-1

да и с удалением - нехорошо. очень "долгая" операция...
Serge_Bliznykov вне форума Ответить с цитированием
Старый 23.08.2009, 20:50   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

а вот перемешивание 500000 записей заняло около трёх секунд:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var i, k, kol : Longint;
  TS : TStringList;
  s  : string;
begin
  TS := TStringList.Create;
  TS.Text := Memo1.Text;
  Randomize;
  kol := TS.Count;
  for i:=0 to kol-1 do
  begin
    k := Random(kol);
    while k=i do k := Random(kol);
    s := TS.Strings[k];
    TS.Strings[k] := TS.Strings[i];
    TS.Strings[i] := s;
  end;

  Memo2.Text := TS.Text;
  FreeAndNil(TS);
end;

Последний раз редактировалось Serge_Bliznykov; 23.08.2009 в 20:58.
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как быстро заригестрировать сайт в каталоге ... krykov Помощь студентам 0 11.05.2009 22:48
MySql - перемешать варианты в базе Shadow_Wind PHP 9 17.10.2008 09:55
Нужно найти папку быстро но как? zotox Помощь студентам 3 21.09.2008 13:35
Как быстро переверннуть(отразить) изображение? Paul Hindenburg Мультимедиа в Delphi 2 10.01.2008 12:51