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

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

Сортировка "пузырьком" [D7]


Страницы:   1 2

Evgeniy ©   (2012-03-12 16:35:00) 

Добрый день! Прошу прощения за то, что открываю уже "хорошо избитую" тему на страницах данного сайта, но объясню это тем, что я очень плохо разбираюсь в delphi, но мне необходимо научиться с ним работать, поэтому буду очень признателен за помощь!
Итак, задача заключается в следующем. Необходимо отсортировать массив случайно сгенерированных чисел в ListBox1 (по возрастанию/убыванию) методом "пузырька", посредством выбора соответствующей кнопки в RadioGroup, а затем вывести отсортированный массив в ListBox2.
Мне удалось сделать генератор чисел в ListBox. Проблема заключается в том, что я не понимаю как взять числа из ListBox1, отсортировать их, приняв во внимание значения RadioGroup (по возрастанию/убыванию) и затем вывести отсортированный массив в ListBox2...
Я очень хочу разобраться в этой задаче, очень Вас прошу помочь! Если можно, объясните мне пошагово что и как нужно писать в коде. Наброски своего кода прилагаю. Заранее спасибо!smiley


procedure SortBubble(Sender: TObject);
var i,n, min: integer;
begin
min:=1;
for i:=2 to n+1 do
if i < min then min:=i;
Form1.ListBox2:=IntToStr(min);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SortBubble(ListBox1.Items);
end;

procedure TForm1.Button2Click(Sender: TObject);
var i: integer;
begin
randomize;
for i:= 1 to 10 do
ListBox1.Items.Add(IntToStr(random(10)));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
ListBox1.Items.Clear;
ListBox2.Items.Clear;
Edit1.Clear;
end;
end.


stas   (2012-03-12 20:16:00) [1]

Evgeniy ©   (12.03.12 18:43) [20]
Мой код наверное не правильный, ну я думаю сам дальше разберешься, сейчас не могу сказать как сделать.


Anatoly Podgoretsky   (2012-03-12 19:55:00) [2]


> Evgeniy ©   (12.03.12 18:04) [15]

А код из примеров чем не устраивает?


Evgeniy   (2012-03-12 18:43:00) [3]

Спасибо, stas!


stas   (2012-03-12 18:39:00) [4]

if k>=ListSource.Count


Evgeniy   (2012-03-12 18:34:00) [5]

Компилируется без ошибок, но при сортировке вылетает ошибка, ругается на строку n:=StrToInt(ListSource[k]);, пишет Value assigned to 'min' never used.


stas   (2012-03-12 18:12:00) [6]

Delphi нет под рукой, что-то типа этого

procedure SortBubble(ListSource,ListDest: TStrings);
var i,k,n, min: integer;
begin
min:=1;
for i:=0 to ListSource.Count-1 do
begin
 k:=i+1; //определяем индекс следующего элемента
 if k>ListSource.Count then min:=StrToInt(ListSource[i]) //проверяем на вхождение в диапазон
 else
  begin
    min:=StrToInt(ListSource[i]); //получаем текущее значение
    n:=StrToInt(ListSource[k]); //получаем следующее значение
    if min>n then min:=n; //определяем минимальное значение
  end;
 
 ListDest.Add (IntToStr(min)); //добавляем в список
end;
end;


Jeer   (2012-03-12 18:06:00) [7]

Чукча ?

См [5].


Evgeniy   (2012-03-12 18:04:00) [8]

Уважаемый stas! Может Вы всё-таки набросайте код по сортировке, я не догоняю:( Я разобрался в коде что Вы написали, но как его доработать не понимаю. Помогите пожалуйста!


Evgeniy   (2012-03-12 17:52:00) [9]

Понятно, спасибо stas! Попробую дальше сам разобраться. Всех благодарю за помощь!


stas   (2012-03-12 17:50:00) [10]

Evgeniy ©   (12.03.12 17:46) [12]
Вместо троеточия нужен код по сортировке, я не стал его приводить.


Evgeniy   (2012-03-12 17:46:00) [11]

Спасибо, stas! Но программа работает не корректно, в отсортированный массив выводятся все единицы?


Evgeniy   (2012-03-12 17:43:00) [12]

ListDest:=IntToStr(min)ругается на эту строчку. Вместо многоточия должен какой-то кусочек кода присутствовать?
Jeer, благодарю Вас за предоставленный код, но он довольно сложен для восприятия, разобраться в нём я не сумею.


stas   (2012-03-12 17:41:00) [13]

Jeer ©   (12.03.12 17:38) [9]
я выше уже поправился и опять написал...


Jeer   (2012-03-12 17:38:00) [14]


> ListDest:=IntToStr(min);


Да, ну ?


stas   (2012-03-12 17:35:00) [15]

procedure SortBubble(ListSource,ListDest: TStrings);
var i,n, min: integer;
begin
min:=1;
for i:=0 to ListSource.Count-1 do
begin

 .....
  ListDest:=IntToStr(min);
end;
end;


stas   (2012-03-12 17:32:00) [16]

SourceList


Evgeniy   (2012-03-12 17:27:00) [17]

Уважаемый stas ©! Я попробовал использовать написанную вами процедуру, но при компиляции кода возникает ошибка, ругается на for i:=0 to List.Count-1 do, точнее на List.Count, пишет что неизвестный идентификатор List. Мне его нужно в переменных объявить? Поясните ещё пожалуйста каждую строчку кода, а то я не совсем понимаю что они значат.


Jeer   (2012-03-12 17:21:00) [18]

var
 arSort: array of double;
 N: integer;

implementation

{$R *.dfm}

uses Math;

procedure TfmStatusForm.btnGenerateClick(Sender: TObject);
var i: integer;
begin
 lbxSrc.Clear;
 lbxTrg.Clear;
 N := updown.Position;
 SetLength(arSort, N);
 for i:=0 to High(arSort)  do begin
   arSort[i] := Random;
   lbxSrc.Items[i] := FloatToStr(arSort[i]);
 end;
end;

procedure TfmStatusForm.btnBubbleSortClick(Sender: TObject);
var  i,j: integer;
    x: double;
 function Ascending(Yes: boolean): boolean;
 begin
   if Yes then Result := (arSort[i] > arSort[j])
   else Result := (arSort[i] <= arSort[j]);
 end;
begin
 for  i := 0 to N-1 do begin
   for j := i+1 to N-1 do begin
     if Ascending(chkAscending.Checked) then begin
       x := arSort[i]; arSort[i] := arSort[j]; arSort[j] := x;
     end;
   end;
   lbxTrg.Items.Add(FloatToStr(arSort[i]));
 end;
end;


Ega23   (2012-03-12 17:02:00) [19]

Вот наглядный пример пузырька:
www.youtube.com/watch?v=lyZQPjUT5B4


stas   (2012-03-12 16:54:00) [20]

точнее так:

...
ListDest.Add (IntToStr(min));


Страницы:   1 2

Наверх

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