IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

> Сортировки простым выбором и бинарными вставками
сообщение
Сообщение #1





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Иван

Репутация: -  0  +


Нужно написать программу, сортирующию массив нескольких чисел по возрастанию методом бинарных вставок и простым выбором, и построить график зависимости кол-ва сравнений от длинны массива.

Код я написал, только не работает процедура сортировки бинарными вставками не работает, вывод общих результатов и построение графика =( Прошу помощи.

program sortirovky;
uses crt,graph;
const n20=20; n200=200;
type mass_200=array[1..n200]of integer;
mass_20=array[1..n20]of longint;
var m,a:mass_200;
m_bv_sort,m_pv_sort:mass_20;
col,kol:longint;
dr,mode:integer;

procedure zapolnenie(var m:array of integer; n:integer);
var i:integer;
begin
for i:=1 to n do
m[i]:=random(50);
end;


procedure vivod_1(var m:array of integer; n:integer);
var i:integer;
begin
for i:=1 to n do
write(m[i]:4);
writeln;
writeln('--------------------------------------------------------------------------------');
writeln;
end;

procedure vivod_2(var mas:mass_20; n_1,n_2:integer);
var i:integer;
begin
for i:=n_1 to n_2 do
write(mas[i]:8);
end;

Procedure Sort_BinVs (var M:array of integer; n:integer);
Var K,I,j,l,X:integer;
Begin
k:=1;
while (k<N) and (M[k]<=M[k+1]) do
begin
inc(k);
end;
if k+1<>N then
begin
for i:=k+1 to N do
begin
X:=M[i];
j:=i;
while ((m[j-1]>x)or(m[j]<x))and(j>0) do
if m[j-1]>x then j:=j div 2
else j:=(i+j) div 2;
for l:=i-1 downto j do
M[l+1]:=M[l];
M[j+1]:=X;
end;
end;
End;


Procedure Sort_vibor (var d:array of integer; n:integer);
Var K,I,j,max:integer;
Begin
for i:=n downto 2 do
begin
k:=i; max:=d[k];
for j:=1 to i-1 do
if max<d[j] then
begin
k:=j;
max:=d[k];
end;
if k<>i then
begin
d[k]:=d[i];
d[i]:=max;
end;
end;
End;

procedure test1;
var i:integer;
begin
for i:=1 to 10 do
begin
zapolnenie(a,i*20);
m:=a;
col:=0;
kol:=0;
sort_BinVs(m,i*20);
m_bv_sort[i]:=col;
m_bv_sort[i+10]:=kol;
m:=a;
col:=0;
kol:=0;
Sort_vibor(m,i*20);
m_pv_sort[i]:=col;
m_pv_sort[i+10]:=kol;
m:=a;
col:=0;
kol:=0;
end;
end;

procedure test2;
begin
writeln(' massiv:');
zapolnenie(a,9);
m:=a;
writeln(' metod binarnoy vstavki:');
vivod_1(a,9);
Sort_BinVs(m,9);
vivod_1(m,9);
writeln(' metod prostyh vstavok:');
m:=a;
vivod_1(a,9);
Sort_vibor(m,9);
vivod_1(m,9);
write('-------------------');
writeln(' press any key...');
readkey;
end;

procedure vivod_3;
begin
writeln('---------------------------------------------');
writeln('N: 20 40 60 80 100 120 140 160 180 200');
write(' metod binarnoy vstavki -------------------');
writeln(' - k-vo sravneniy:');
vivod_2(m_bv_sort, 1, 10);
writeln(' - k-vo perestanovok:');
vivod_2(m_bv_sort, 11, 20);
write(' sortirovka prostym viborom ---------------');
writeln(' - k-vo sravneniy:');
vivod_2(m_pv_sort, 1, 10);
writeln(' - k-vo perestanovok:');
vivod_2(m_bv_sort, 11, 20);

write('----------------------------------');
write(' press any key...');
readkey;
end;

procedure graf(mas:mass_20; n:byte; mashtab:integer; nazvanie:string);
var i,fl:byte;
begin
line(45, 460, 80, 460-(mas[n+1]*40 div mashtab));
fl:=0;
for i:=1 to 9 do
begin
if ((460-(mas[i+n+1]*40/mashtab))<0)and(fl=0) then
begin
outtextxy(80+i*35, 450-(mas[i+n]*40 div mashtab), nazvanie);
fl:=1;
end;
line(45+i*35, 460-(mas[i+n]*40 div mashtab), 80+i*35, 460-(mas[i+n+1]*40 div mashtab));
end;
if fl=0 then outtextxy(80+i*35, 450-(mas[i+n+1]*40 div mashtab), nazvanie);
end;
procedure grafic(tip:byte);
var key:char;
i,mashtab,n:integer;
st:string;
begin
initgraph(dr,mode,'I:\Soft\TurboPascal\TurboPascal\BGI');
if graphresult=0 then
begin
line(45,0,45,getmaxy);
line(0,460,500,460);

outtextxy(430,465,'k-vo elementov');
if tip=1 then
begin
outtextxy(53,10,'k-vo sravneniy');
mashtab:=3000;
n:=0;
end
else
begin
outtextxy(53,10,'k-vo perestanovok');
mashtab:=1000;
n:=10;
end;
setcolor(8);
outtextxy(37,465,'0');
for i:=1 to 10 do
begin
line(45,460-i*40,395,460-i*40);
line(45+i*35,460,45+i*35,60);
str(i*20,st);
outtextxy(35+i*35,465,st);
str(i*mashtab,st);
outtextxy(5,465-i*40,st);
end;
setcolor(10);
graf(m_bv_sort, n, mashtab,'bin vst');
setcolor(12);
graf(m_pv_sort, n, mashtab,'prost vyb');
readkey;
closegraph;
end
else
begin
writeln('GRAFIKA NE RABOTAET press any key...');
readkey;
end;
end;

begin
clrscr;
randomize;
test2;
test1;
vivod_3;
grafic(1);
grafic(2);
end.


Сообщение отредактировано: Offside -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов(1 - 3)
сообщение
Сообщение #2


Гость






Цитата
Код я написал, только не работает процедура сортировки бинарными вставками не работает, вывод общих результатов и построение графика =(
Да у тебя и сортировка выбором не работает. А все потому, что открытые массивы индексируются с 0 до n-1, а не с 1 до n, как ты подразумевал... Исправляй сортировку для начала, а дальше посмотрим... И включи режим контроля границ в настройках компилятора, чтобы ВИДЕТЬ ошибки, а не замалчивать их...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





Группа: Пользователи
Сообщений: 5
Пол: Мужской
Реальное имя: Иван

Репутация: -  0  +


Цитата(volvo @ 20.12.2009 12:47) *

Да у тебя и сортировка выбором не работает.


Как раз она-то и работает...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
Как раз она-то и работает...
Уверен? Повторяю: в опциях включи контроль границ, и запусти вот такую программу (вместо того, что у тебя в основном блоке):

{ ... Тут весь твой код ... }
const
nn = 10;
arr: array[1 .. nn] of integer = (
10, 9, 8, 7, 6, 5, 4, 3, 2, 1
);
var
ii: integer;
begin
for ii := 1 to nn do write(arr[ii]:3);
writeln;
sort_vibor(arr, nn);
for ii := 1 to nn do write(arr[ii]:3);
writeln;
end.

Должно отработать? Обязано. А ты запусти, поинтересуйся... И увидишь, КАК оно работает...
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 9.09.2025 4:42
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name