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

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

Сортировка


stany ©   (2002-10-28 11:22:00) 

Извиняюсь за глупый вопрос,но с утра долблюсь такая ерудна не получается!:-(
Проблема вот в чем,нужно реализовать следующий алгоритм сортировки:Просматривая массив от 1-го эл-та найти минимальный эл-т и поместить его на место первого элемента,а первый на
место минимального;Просматривая массив от 2-го эл-та...
В итоге должен получится массив,отсортированный по возрастанию(1 2 3 ...).Привожу код моей попытки реализовать эту сортировку,извиняюсь за экибанистость кода.Помогите кто может,
заранее благодарен.
procedure TForm1.Select_Sort;
const
size=5;

var
b:array[1..size] of Integer;
i:integer;//индекс для ввода массива
k,count:integer;
next:integer;
buf:integer;//буфер для обмена элементов массива
min:integer;
begin
for i:=1 to size do
b[i]:=StrToInt(StringGrid1.Cells[i-1,0]);
count:=0;
i:=1;
repeat
min:=i;
next:=i+1;
repeat
if b[next]< b[min] then min:=next;
buf:=b[i];
b[i]:=b[min];
b[min]:=buf;
next:=next+1;
until next>size;
if next>size then
begin
inc(i);
if count=0 then Memo1.Lines.Clear;
if count>=0 then Memo1.Lines.Add("");
for k:=1 to size do
Memo1.Lines[count]:=Memo1.Lines[count]+(IntToStr(b[k]));
inc(count)
//5 вышестояших строк выводят эл-ты массива в одну строку,
//новая линия добавляется при новом выводе
end
until i>size-1;
Memo1.Lines.Add("Массив отсортирован");
end;


stany   (2002-10-28 12:36:00) [1]

Спасибо всем большое!


Alx2   (2002-10-28 12:02:00) [2]

Если буквально следовать заданию, то так, например :)

procedure Sort(var A: array of Integer);

function minimum(Start: Integer): Integer;
var K: Integer;
begin
result := Start;
for K := Start + 1 to High(A) do
if A[K] < A[result] then result := K;
end;

procedure exchange(idx1, idx2: Integer);
var tmp: Integer;
begin
if A[idx1] > A[idx2] then
begin
tmp := A[idx1];
A[idx1] := A[idx2];
A[idx2] := tmp;
end;
end;

var K: Integer;
begin
for K := Low(A) to High(A) do exchange(K, minimum(K + 1));
end;

// Пример
var A: array[1..10] of Integer;
K: Integer;
begin
for K := 1 to 10 do A[K] := random(10);
Sort(A);
for K := 1 to 10 do Memo1.Lines.Add(IntToStr(A[K]));
end;



BOA_KAA   (2002-10-28 11:47:00) [3]

Чесно говоря, в коде разбираться не очень охота, но требуемый алгоритм можно реализовать так:

for i:=1 to size-1 {это же size?:-)} do
begin
min:=b[i];
for j:=i+1 to size do
if min > b[j] then
begin
buf:=min;
min:=b[j];
b[j]:=buf;
end;
end;


Вроде должно работать:-))


Наверх

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