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

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

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

> Методы сортировок. Вставка, выбор + ...
сообщение
Сообщение #1


Новичок
*

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

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


Для метода пузырька, вставок и выбора посчитать число сравнений и число перестановок. Для метода пузырька я это сделал но для метода вставок не знаю как посчитать сравнения а для метода выбора - число перестановок. Помогите пожалуйста


uses crt;
const n=6;
var i,j,peres,k,temp,srav,otv:integer;
a: array [1..n] of integer;
procedure puzyr;
begin
peres:=0;
srav:=0;
writeln('Vvedi elem mas: ');
for i:=1 to n do
readln(a[i]);
for i := 2 to n do
begin
for j := n downto i do
begin
inc(srav);
if a[j-1] > a[j] then
begin
temp := a[j-1];
a[j-1] := a[j];
a[j] := temp;
inc(peres);
end;
end;
end;
writeln('Sortirovka');
for i:=1 to n do
writeln(a[i]);
writeln('Chislo perestanovok = ',peres);
writeln('Chislo sravneniy = ',srav);
readln;
end;

procedure vstavka;
begin
peres:=0;
srav:=0;
writeln('Vvedi elem mas: ');
for i:=1 to n do
readln(a[i]);
for i := 2 to n do
begin
temp := a [i];
j := i-1;
While (j > 0) and (temp < a [j] ) do
begin
a [j+1] := a [j];
j := j-1;
inc(peres);
end;
a [j+1] := temp;
end;
writeln('Sortirovka');
for i:=1 to n do
writeln(a[i]);
writeln('Chislo perestanovok = ',peres);
writeln('Chislo sravneniy = ',srav);
readln;
end;

procedure vybor;
begin
peres:=0;
srav:=0;
writeln('Vvedi elem mas: ');
for i:=1 to n do
readln(a[i]);
for i := 1 to n-1 do
begin
k := i;
temp := a [i];
for j := i+1 to n do
begin
inc(srav);
if a [j] < temp then
begin
k := j;
temp := a [j];
end;
end;
a [k] := a [i];
a [i] := temp;
end;
writeln('Sortirovka');
for i:=1 to n do
writeln(a[i]);
writeln('Chislo perestanovok = ',peres);
writeln('Chislo sravneniy = ',srav);
readln;
end;

begin
clrscr;
repeat
begin
writeln('1-Puzyr 2-Vstavka 3-Vybor 4-Exit ');
readln(otv);
case otv of
1:puzyr;
2:vstavka;
3:vybor;
4:end;
end;
until otv=4;
end.



Забыл написать что должно получиться для массива 15-33-42-07-12-19: метод вставок 12 сравнений и 8 перестановок, метод выбора 15 сравнений, 4 перестановки

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


Гость






метод вставки - элементарно:
procedure vstavka;

{ Определяешь свою функцию сравнения... }
function less(a, b: integer): boolean;
begin
inc(srav);
less := a < b;
end;

begin
peres:=0;
srav:=0;
writeln('Vvedi elem mas: ');
for i:=1 to n do
readln(a[i]);
for i := 2 to n do
begin
temp := a [i];
j := i-1;
While (j > 0) and less(temp, a[j]) do
begin
a [j+1] := a [j];
j := j-1;
inc(peres);
end;
a [j+1] := temp;
end;
writeln('Sortirovka');
for i:=1 to n do
writeln(a[i]);
writeln('Chislo perestanovok = ',peres);
writeln('Chislo sravneniy = ',srav);
readln;
end;

Сейчас гляну метод выбора...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

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

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


За метод вставок спасибо good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Новичок
*

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

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


С этим выбором ну никак не получается, получается только или 5 или 6. А должно быть 4.

а1 а2 а3 а4 а5 а6 Выполняемые операции
шаг 1 15 33 42 07 12 19 сравнение 15 и 33, min = 15
15 33 42 07 12 19 сравнение 15 и 42, min = 15
15 33 42 07 12 19 сравнение 15 и 07, min = 07
15 33 42 07 12 19 сравнение 07 и 12, min = 07
15 33 42 07 12 19 сравнение 07 и 19, min = 07, обмен 15 и 07
шаг 2 07 33 42 15 12 19 сравнение 33 и 42, min = 33
07 33 42 15 12 19 сравнение 33 и 15, min = 15
07 33 42 15 12 19 сравнение 15 и 12, min = 12
07 33 42 15 12 19 сравнение 12 и 19, min = 12, обмен 33 и 12
шаг 3 07 12 42 15 33 19 сравнение 42 и 15, min = 15
07 12 42 15 33 19 сравнение 15 и 33, min = 15
07 12 42 15 33 19 сравнение 15 и 19, min = 15, обмен 42 и 15
шаг 4 07 12 15 42 33 19 сравнение 42 и 33, min = 33
07 12 15 42 33 19 сравнение 33 и 19, min = 19, обмен 42 и 19
шаг 5 07 12 15 19 33 42 сравнение 33 и 42, min = 33, обмена нет, все готово

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


Гость






procedure vybor;
begin
peres:=0;
srav:=0;
writeln('Vvedi elem mas: ');
for i:=1 to n do
readln(a[i]);
for i := 1 to n-1 do
begin
k := i;
temp := a [i];
for j := i+1 to n do
begin
inc(srav);
if a [j] < temp then
begin
k := j;
temp := a [j];
end;
end;
a [k] := a [i];
if k <> i then inc(peres); { Перестановка будет ТОЛЬКО в этом случае !!! }
a [i] := temp;
end;
writeln('Sortirovka');
for i:=1 to n do
writeln(a[i]);
writeln('Chislo perestanovok = ',peres);
writeln('Chislo sravneniy = ',srav);
readln;
end;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

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

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


Danke good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

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

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


Препод сказал что нужно сделать тоже самое и для улучшенных методов.

Код

uses crt;
const n=15;
var
a:array [1..n] of integer;
b:array [1..n] of integer;
peres,srav:longint;
i:integer;
otv:char;

procedure menu;
begin
     writeln('1-Puzyrek');
     writeln;
     writeln('2-Vstavka');
     writeln;
     writeln('3-Vybor');
     writeln;
     writeln('4-Shell');
     writeln;
     writeln('5-Bystraya sortirovka');
     writeln;
     writeln('6-Piramida');
     writeln;
     writeln('7-Sozdat massiv');
     writeln;
     writeln('8-Exit');
     writeln;
     otv:=readkey;
end;

procedure vyvod;
begin
     writeln('Ishodnyj massiv');
     writeln;
     for i:=1 to n do
     write(' ',b[i]);
     writeln;
     writeln;
     writeln('Posle sortirovki');
     writeln;
     for i:=1 to n do
     write(' ',a[i]);
     writeln;
     writeln;
end;

function sravnenie(a, b: integer): boolean;
begin
     inc(srav);
     sravnenie := a < b;
end;

procedure sozd_mas;
var i:integer;
begin
     writeln('vvedite elem mas');
     for i:=1 to n do
         readln(b[i]);
     writeln('Massiv sozdan');
     writeln;
end;

procedure puzyr;
var i,j,temp:integer;
begin
    writeln;
    writeln(' METOD ny3bIpbKA ');
    writeln;
    peres:=0;
    srav:=0;
    for i:=1 to n do
    a[i]:=b[i];
    for i := 2  to n  do
    begin
        for j:=n downto i do
        begin
            inc(srav);
            if  a[j-1] > a[j]  then
            begin
                temp := a[j-1];
                a[j-1] := a[j];
                a[j] := temp;
                inc(peres);
            end;
        end;
    end;
    vyvod;
    writeln('Chislo perestanovok = ',peres);
    writeln('Chislo sravneniy = ',srav);
    writeln;
    readln;
end;

procedure vstavka;
var i,j,temp:integer;
begin
    writeln;
    writeln(' METOD BCTABOK');
    writeln;
    peres:=0;
    srav:=0;
    for i:=1 to n do
    a[i]:=b[i];
    for i:=2 to n do
    begin
        temp:=a[i];
        j:=i-1;
        While (j>0) and (sravnenie(temp, a[j])) do
        begin
            a[j+1]:=a[j];
            dec(j);
            inc(peres);
        end;
        a[j+1]:=temp;
    end;
    vyvod;
    writeln('Chislo perestanovok = ',peres);
    writeln('Chislo sravneniy = ',srav);
    writeln;
    readln;
end;

procedure vybor;
var i,j,k,temp:integer;
begin
    writeln;
    writeln('METOD BbI6OPA');
    writeln;
    peres:=0;
    srav:=0;
    for i:=1 to n do
    a[i]:=b[i];
    for  i:=1 to n-1 do
    begin
        k:=i;
        temp:=a[i];
        for j:=i+1 to n do
        begin
            inc(srav);
            if a[j]<temp then
            begin
                k:=j;
                temp:=a[j];
            end;
        end;
        a[k]:=a[i];
        if k<>i then inc(peres);
        a [i]:=temp;
    end;
    vyvod;
    writeln('Chislo perestanovok = ',peres);
    writeln('Chislo sravneniy = ',srav);
    writeln;
    readln;
end;

procedure Shell;
var h:array [1..n] of integer;
t,m,i,j,k,temp:integer;
begin
    writeln;
    writeln(' METOD Shella ');
    writeln;
    peres:=0;
    srav:=0;
    for i:=1 to n do
    a[i]:=b[i];
    write('Chislo shagov: ');
    readln(t);
    for i:=1 to t do
    begin
        write(i,'-y shag = ');
        readln(h[i]);
    end;
    for m:=1 to t do
    begin
        k:=h[m];
        for i:=k+1 to n do
        begin
            temp:=a[i];
            j:=i-k;
            while (j>0) and (temp<a[j]) do
            begin
                a[j+k]:=a[j];
                dec(j,k);
                inc(srav);
            end;
            a[j+k]:=temp;
            inc(peres);
        end;
    end;
    vyvod;
    writeln('Chislo perestanovok = ',peres);
    writeln('Chislo sravneniy = ',srav);
    writeln;
    readln;
end;


Procedure QuickSort(left,right:integer);
var i,j:integer;
sred,temp:integer;
begin
    i:=left;
    j:=right;
    sred:=a[(left+right) div 2];
    repeat
     while (a[i]<sred) do
         begin
         inc(i);
         inc(srav);
         end;
     while (a[j]>sred) do
         begin
         dec(j);
         inc(srav);
         end;
     if i<=j then
        begin
        temp:=a[i];
        a[i]:=a[j];
        a[j]:=temp;
        inc(i);
        dec(j);
        inc(srav);
        end;
    until i>j;
    if left<j then
       begin
       inc(peres);
       QuickSort(left,j);
       end;
    if i<right then
       begin
       inc(peres);
       QuickSort(i,right);
       end;
end;


Procedure Sito(al,ar:word);
var i,j,x:integer;
begin
    i:=al;
    j:=2*al;
    x:=a[al];
    inc(srav);
    if (j<ar) and (a[j+1]>a[j]) then  inc(j);
    while (j<=ar) and (a[j]>x) do
    begin
        a[i]:=a[j];
        i:=j;
        j:=2*j;
        inc(srav);
        inc(peres);
        if (j<ar) and (a[j+1]>a[j]) then
           begin
           inc(j);
           inc(srav);;
        end;
    end;
    a[i]:=x;
end;

procedure piramida;
var left,right,temp:integer;
begin
    left:=(n div 2)+1;
    right:=n;
    while left>1 do
    begin
        left:=left-1;
        Sito(left,right);
    end;
    while right>1 do
    begin
        temp:=a[1];
        inc(srav);
        inc(peres);
        a[1]:=a[right];
        a[right]:=temp;
        right:=right-1;
        Sito(left,right);
    end;
end;

begin
     clrscr;
     randomize;
     repeat
         begin
         menu;
         case otv of
             '1':puzyr;
             '2':vstavka;
             '3':vybor;
             '4':Shell;
             '5':begin
                 writeln;
                 writeln(' METOD Bystroy sortirovki ');
                 writeln;
                 peres:=0;
                 srav:=0;
                 for i:=1 to n do
                     a[i]:=b[i];
                 QuickSort(1,n);
                 vyvod;
                 writeln('Chislo perestanovok = ',peres);
                 writeln('Chislo sravneniy = ',srav-1);
                 writeln;
                 readln;
                 end;
             '6':begin
                 writeln;
                 writeln('Piramidalnaya sortirovka');
                 writeln;
                 peres:=0;
                 srav:=0;
                 for i:=1 to n do
                     a[i]:=b[i];
                 piramida;
                 vyvod;
                 writeln('Chislo perestanovok = ',peres);
                 writeln('Chislo sravneniy = ',srav);
                 writeln;
                 readln;
                 end;
             '7':sozd_mas;
             '8':end;
         end;
     until otv='8';
end.


Исходный массив для метода Шелла: 15 33 42 7 12 19. 2 шага шруппировки: 3 и 1. должно быть 8 сравнений и 5 перестановок.
Для быстрой сортировки: 13 42 28 17 9 25 47 31 39 15 20. 22 сравнения и 6 перестановок. Считает все правильно но может быть результаты подогнаны?
Для пирамидалььной сортировки: 45 40 28 25 30 44 33 22 60 15 55 47 66 20 50. 73 сравнения и 49 перестановок.
Помогите пожалуйста посчитать сравнения и перестановки. Заранее спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Ты мне можешь объяснить, ЗАЧЕМ ты постишь программу целиком? Что, у нас нет этих методов сортировки? А вдруг у тебя они сбоят? А придет человек, скопирует ТВОЙ метод (из-за заголовка), у него не сработает, и он будет засыпать МЕНЯ (как модератора) гневными письмами "Отстой! Не работает! Фтопку такой сайт!"

А ведь в FAQ-е примеры тестируются не 1 и даже не 100 раз, и на любых значениях...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

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

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


Программа работает. Она же все таки сортирует, но как сосчитать перестановки и сравнения? В примерах в факе нет этого или я просто не вижу
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 





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