Использование сортировки




КАЗАНСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСТИТЕ

 

 

ЦЕНТР ОЛИМПИАДНОЙ ПОДГОТОВКИ

 

 

Хадиев Р.М.

 

 

Сортировки

 

Казань – 2018 г.


 

Оглавление

1. Генерация последовательности. 3

2. Работа с экстремумами. 4

3. Сортировка. 7

3.1. Упорядочить последовательность в порядке возрастания. 7

3.2. Сортировка «пузырком». 8

3.3. Сортировка по счетчику. 9

3.4. Сортировка по ключу. 10

3.5. Сортировка слиянием.. 11

3.6. Разрядная сортировка. 12

3.7. Сортировка подсчетом.. 14

3.8. Использование сортировки. 15

АСМР. №340 коробки. 15

АСМР. №41 Сортировка подсчетом.. 15

 

 


 

Генерация последовательности

Const N=10;

var k,i,res:integer;

a: array [1..N] of integer;

begin

for i:=1 to n do read (a[i]);

write('A=(');

for i:=1 to n do write (' ',a[i]*a[i]);

writeln(')')

end.

 

Для облегчения отладки программы последовательность можно генерировать с помощью датчика случайных чисел

Const N=10;

var k,i,res:integer;

a: array [1..N] of integer;

begin

for i:=1 to n do a[i]:=random(10);

write('A=(');

for i:=1 to n do write (' ',a[i]);

writeln(')')

end.

 

Const N=10;

var k,i,res:integer;

a: array [1..N] of integer;

begin

write('A=(');

for i:=1 to n do

begin

a[i]:=random(10);

write (' ',a[i])

end;

writeln(')');

end.

Работа с экстремумами

1) Найти максимальное значение в заданной последовательности.

Const N=10;

var k,i,max:integer;

a: array [1..N] of integer;

begin

write('A=(');

for i:=1 to n do

begin

a[i]:=random(10);

write (' ',a[i])

end;

writeln(')');

max:=a[1]; // без альтернативный кандидат на решение

for i:=2 to n do

if max<a[i] then

max:=a[i];

writeln('max=',max)

end.

 

2) Найти число максимальных значений в заданной последовательности.

Const N=10; var c,k,i,max:integer; a: array [1..N] of integer; begin write('A=('); for i:=1 to n do begin a[i]:=random(6); write (' ',a[i]) end; writeln(')'); max:=a[1]; for i:=2 to n do if a[i]>max then max:=a[i]; c:=0; for i:=1 to n do c+=ord(a[i]=max); writeln('max=',max); writeln('kol-vo max chisel=',c) end. Const N=10; var c,k,i,max:integer; a: array [1..N] of integer; begin write('A=('); for i:=1 to n do begin a[i]:=random(6); write (' ',a[i]) end; writeln(')'); max:=a[1]; c:=1; for i:=2 to n do if a[i]>max then begin max:=a[i]; c:=1 end else c+= ord(a[i]=max); write('max=',max,#13, 'kol-vo max chisel=',c) end.  

 

3) Найти номера элементов с максимальным значением в заданной последовательности.

Const N=10;

var p,c,k,i,max:integer;

a: array [1..N] of integer;

begin

write('A=(');

for i:=1 to n do

begin

a[i]:=random(6);

write (' ',a[i])

end;

writeln(')');

max:=a[1];

for i:=2 to n do

if a[i]>max then

max:=a[i];

writeln('max=',max);

c:=0;

for i:=1 to n do

if a[i]=max then

c:=c+1;

writeln('kol-vo max chisel=',c);

write('pozicii max elementov=');

for i:=1 to n do

if a[i]=max then

write(' ',i);

end.

 

4) Записать 3 максимальных элемента в конец последовательности элементов с максимальным значением в заданной последовательности.

Const N=10;

var p,c,k,i,max,nmax:integer;

a: array [1..N] of integer;

procedure print;

var i:integer;

begin

write('A=(');

for i:=1 to n do

write (' ',a[i]);

writeln(')');

end;

begin

for i:=1 to n do

a[i]:=random(6);

print;

max:=a[1];nmax:=1;

for i:=2 to n do

if a[i]>max then

begin

max:=a[i];

nmax:=i

end;

writeln('max=',max,' nommax=',nmax);

p:=a[n];a[n]:=a[nmax];a[nmax]:=p;

print;

max:=a[1];nmax:=1;

for i:=2 to n-1 do

if a[i]>max then

begin

max:=a[i];

nmax:=i

end;

writeln('max=',max,' nommax=',nmax);

p:=a[n-1];a[n-1]:=a[nmax];a[nmax]:=p;

print;

max:=a[1];nmax:=1;

for i:=2 to n-2 do

if a[i]>max then

begin

max:=a[i];

nmax:=i

end;

writeln('max=',max,' nommax=',nmax);

p:=a[n-2];a[n-2]:=a[nmax];a[nmax]:=p;

print;

end.

Сортировка

Упорядочить последовательность в порядке возрастания.

Const N=10;

var p,c,k,i,max,nmax,j:integer;

a: array [1..N] of integer;

procedure print;

var i:integer;

begin

write('A=(');

for i:=1 to n do

if i>=j then write ('_',a[i])

else write (' ',a[i]);

writeln(')');

end;

begin

for i:=1 to n do

a[i]:=random(6);

print;

for j:=n downto 2 do

begin

max:=a[1];nmax:=1;

for i:=2 to j do

if a[i]>max then

begin

max:=a[i];

nmax:=i

end;

writeln('max=',max,' nommax=',nmax);

p:=a[j];a[j]:=a[nmax];a[nmax]:=p;

print

end;

end.

Сортировка «вставкой»

Const N=10;

var p,c,k,i,max,nmax,j:integer;

a: array [1..N] of integer;

procedure print;

var i:integer;

begin

write('A=(');

for i:=1 to j do

write ('_',a[i]);

writeln(')');

end;

begin

j:=1

a[1]:=random(6);

print;

for j:=2 to т do begin

r:=random(1);

i:=j-1;

while a[i]>r and j>0 do begin

a[i+1]:=a[i];

i-=1

end;

a[i]:=r;

print

end;

end.

Сортировка «пузырком»

Const N=10;

var p,c,k,i,max,nmax,j:integer;

a: array [1..N] of integer;

procedure print;

var i:integer;

begin

write('A=(');

for i:=1 to n do

if i>=j then

write ('_',a[i])

else

write (' ',a[i]);

writeln(')');

end;

begin

for i:=1 to n do

a[i]:=random(6);

print;

for j:=n downto 2 do begin

for i:=2 to j do

if a[i]<a[i-1] then begin

p:=a[i];a[i]:=a[i-1];a[i-1]:=p;

end;

print

end;

end.

Сортировка по счетчику

Задана последовательность целых чисел с абсолютным значением меньше 100. Упорядочить в порядке возрастания.

var

i,j,n:integer;

a:array[-100..100] of int64;

begin

read(n);

for i:=1 to n do

begin

read(j);

inc(a[j])

end;

for i:=-100 to 100 do

for j:=1 to a[i] do

write(i:8)

end.

Сортировка по ключу

Задана последовательность n (n< 1000000) вещественных чисел из интервала (0,100). Упорядочить в порядке возрастания целых частей.

Var

A,b:array[0..1000000] of real;

R,kl: array[0..99] of integer;

i,j,n:integer;

Begin

For i:=0 to 9 do r[i]:=0;

Read(n);

For i:=1 to n do

Begin

Read(a[i]);

R[trunc(a[i])]+=1

End.

Kl[0]:=1;

For i:=1 to 99 do kl[i]:=kl[i-1]+r[i-1];

For i:=1 to n do

Begin

B[kl[trunc(a[i])]]:=a[i];

Kl[trunc(a[i])]+=1

End;

For i:=1 to n do write(b[i],’ ‘)

End.

Сортировка слиянием

Заданы 2 упорядоченные последовательности. Объединить в одну упорядоченную последовательность.

Var a,b:array[1..100] of integer;

C:array[1..200] of integer;

ia,ib,ic:integer;

Begin

// формируется случайная возрастающая последовательность А

A[1]:=random(3);

For i:=2 to 10 do a[i]:=a[i-1] + random(3);

// формируется случайная возрастающая последовательность B

B[1]:=random(3);

For i:=2 to 10 do b[i]:=b[i-1] + random(3);

// объединение

For ic:=1 to 200 do

If ia>100 then Begin // А переписано в С и дописывается В

C[ic]:=b[ib];

ib+=1

End

Else

If ib>100 then Begin // B переписано в С и дописывается A

C[ic]:=a[ia];

ia+=1

End

Else // эелементы в А и В еще есть

If a[ia]>b[ib] then Begin // переписывается элемент из В

C[ic]:=b[ib];

ib+=1

End

Else begin

C[ic]:=a[ia];

ia+=1

End;

// вывод результата

For ic:=1 to 200 do Write(c[ic],’ ‘)

End.

Разрядная сортировка

Задана случайная последовательность

А: 12 4 54 3 1 0 432 59 1024 2421 16 642 392 82 1000

К:     R:  
        0 1000
        1 2421
        12432 642 392 82
         
        4 54 1024
         
        16
         
         
        59

А: 0 1000 1 2421 12 432 642 392 82 3 16 59

К:     R:  
        00 1000 01 03
        12 16
        2421
        432
        642
        59
         
         
        82
        392

А: 0 1000 1 3 12 16 2421 432 642 59 82 392

К:     R:  
        000 1000 001 003 012 016 059 082
         
         
        392
        2421 432
         
        642
         
         
         

 

А: 0 1000 1 3 12 16 59 82 392 2421 432 642

К:     R:  
        0000 0003 0012 0016 0059 0082 0392 0432 0642
        1000
        2421
         
         
         
         
         
         
         

 

A: 0 3 12 16 59 82 392 432 642 1000 2421

Программа:

 

Var

St,n,i,j,m,q:integer;

a:array]1..10000] of word;

k:array[0..9] of integer;

r:array[0..9,1..10000] of integer;

begin

read(n);

for i:=1 to n do read(a[i];

st:=1;

for q:=1 to 5 do // число значащих разрядов 5

begin

for i:=0 to 9 do k[i]:=0;

for i:=1 to n do begin

m:=a[i] div st mod 10;

k[m]+=1;

r[k[m]]:=a[i];

end;

m:=1;

for i:=0 to 9 do

for j:=1 to k[i] do begin

a[m]:=r[i,j];

m+=1

end;

st*=10

end;

end.

Сортировка подсчетом

Задана последовательность не повторяющихся N чисел. Упорядочить в порядке возрастания.

Для данного числа его позиция определятся числом элементов меньше данного

Var i,j,k,n:integer;

X,y:array[1..10000] of integer;

Begin

Read(n)

For i:=1 to n do begin

K:=1;

For j:=1 to n do

If x[i]>x[j] then k+=1

Y[k]:=x[i]

End;

For i:= to n do write(y[i],’ ‘)

End.

End.

Использование сортировки

АСМР. №340 коробки

На столе лежат 2 коробки размера A1 × B1 × C1 и A2 × B2 × C2. Выяснить можно ли одну из этих коробок положить в другую, если разрешены повороты коробок вокруг любого ребра на угол 90 градусов.

Если коробки одинаковы, вывести "Boxes are equal". Если первая коробка может быть положена во вторую, вывести "The first box is smaller than the second one". Если вторая коробка может быть положена в первую, вывести "The first box is larger than the second one". Иначе, "Boxes are incomparable".

Решение:

#include <bits/stdc++.h>

#define f for(i=0;i<3;i++)

#define s(a) sort(a,a+3);

using namespace std;

main()

{

int a[3],b[3],c=0,v=0,i;

f cin>>a[i];

f cin>>b[i];

sort(a,a+3);

sort(b,b+3);

f {

c+=a[i]==b[i];

v+=a[i]>b[i];

}

cout<<(c>2? "Boxes are equal":

v>0&c+v>2? "The first box is larger than the second one":

v<1? "The first box is smaller than the second one":

"Boxes are incomparable");

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2019-11-29 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: