Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GRIGOREV.DOC
Скачиваний:
4
Добавлен:
01.07.2025
Размер:
608.26 Кб
Скачать

Задача 3. Медленная сортировка

Ввести последовательность вещественных чисел длиной не более 100 чисел. Упорядочить последовательность по неубыванию, используя алгоритм сортировки выбором.

{ Решение задачи 3 на языке PASCAL }

CONST Nmax=100;

TYPE TArray=ARRAY[1..Nmax] OF Real;

VAR A : TArray; n,i,j,Imin : Byte; Min : Real;

BEGIN Write('Введите длину последовательности ');

Read(n);

IF (n=0)OR(n>Nmax) THEN BEGIN

WriteLn('Неверная длина'); Halt; END;

WriteLn('Введите последовательность');

FOR i:=1 TO n DO Read(A[i]);

FOR i:=1 TO n-1 DO BEGIN

Imin:=i; Min:=A[i];

FOR j:=i+1 TO n DO

IF A[j]<Min THEN BEGIN Min:=A[j]; Imin:=j; END;

IF Imin<>i THEN BEGIN A[Imin]:=A[i]; A[i]:=Min; END;

END;

WriteLn('Упорядоченная последовательность :');

FOR i:=1 TO n DO Write(A[i]:16); WriteLn;

END.

/* Решение задачи 3 на языке C */

#define NMAX 100

typedef double TArray[NMAX];

void main(void) {TArray a; char n,i,j,Imin; double Min;

printf("\nВведите длину последовательности "); scanf("%i",&n);

if(n<=0||n>NMAX){printf("\nНеверная длина"); exit(1);}

printf("\nВведите последовательность\n");

for(i=0;i<n;i++)scanf("%lg",a+i);

for(i=0;i<n-1;i++){

for(Imin=i,Min=a[i],j=i+1;j<n;j++)if(a[j]<Min){Min=a[j];Imin=j;}

if(Imin!=i){a[Imin]=a[i];a[i]=Min;}}

printf("\nУпорядоченная последовательность :\n");

for(i=0;i<n;i++)printf("%16lg",a[i]);}

C Решение задачи 3 на языке FORTRAN

PARAMETER(Nmax=100)

REAL*8 A(Nmax),Min

INTEGER*1 n,i,j,Imin

PRINT*,'Введите длину последовательности '

READ*,n

IF (n.LE.0.OR.n.GT.Nmax) STOP'Неверная длина'

PRINT*,'Введите последовательность'

READ*,(A(i),i=1,n)

DO 1 i=1,n-1

Imin=i

Min=A(i)

DO 2 j=i+1,n

IF(A(j).LT.Min) THEN

Min=A(j)

Imin=j

END IF

2 CONTINUE

IF(Imin.NE.i) THEN

A(Imin)=A(i)

A(i)=Min

END IF

1 CONTINUE

PRINT*,'Упорядоченная последовательность :'

PRINT 99,(a(i),i=1,n)

99 FORMAT(5G16.3)

END

Задача 4. Быстрая сортировка

Ввести натуральное число N, не превосходящее 10000. Получить N случайных натуральных чисел, не превосходящих 999. Упорядочить числа по неубыванию, используя алгоритм сортировки бинарными вставками.

{ Решение задачи 4 на языке PASCAL }

{$X+}

USES Crt;

CONST Nmax=10000; Range=1000;

TYPE TArray=ARRAY[1..Nmax] OF Word;

PROCEDURE Print(n:Word; VAR A:TArray);

VAR i : Word;

BEGIN i:=1;

WHILE i<=n DO BEGIN

Write(A[i]:4);

IF i MOD 480=0 THEN BEGIN

Write('Нажмите клавишу'); ReadKey; WriteLn; END;

Inc(i);

END;

IF i MOD 480<>0 THEN BEGIN

Write(#10,#13,'Нажмите клавишу'); ReadKey; WriteLn; END;

END;

PROCEDURE BinarySort(n:Word; VAR a:TArray);

VAR i,Nsort,as,bs,xs,Tmp : Word;

BEGIN Nsort:=1;

WHILE Nsort<n DO BEGIN

Tmp:=a[Nsort+1];

IF Tmp>=a[Nsort] THEN BEGIN Inc(Nsort); Continue; END;

IF Tmp<=a[1] THEN BEGIN

FOR i:=Nsort+1 DOWNTO 2 DO a[i]:=a[i-1];

a[1]:=Tmp; Inc(Nsort); Continue; END;

as:=1; bs:=Nsort; xs:=(as+bs)DIV 2;

WHILE (xs<>as)AND(xs<>bs) DO BEGIN

IF Tmp=a[xs] THEN BEGIN bs:=xs+1; Break; END;

IF Tmp<a[xs] THEN bs:=xs ELSE as:=xs;

xs:=(as+bs)DIV 2;

END;

FOR i:=Nsort+1 DOWNTO bs+1 DO a[i]:=a[i-1];

a[bs]:=Tmp; Inc(Nsort);

END;

END;

VAR A : TArray; n,i : Word;

BEGIN Write('Введите длину последовательности '); Read(n);

Randomize; FOR i:=1 TO n DO A[i]:=Random(Range);

Print(n,A);

WriteLn('Упорядоченная последовательность :');

BinarySort(n,A); Print(n,A);

END.

/* Решение задачи 4 на языке C */

#include<stdio.h>

#include<conio.h>

#include<time.h>

#include<stdlib.h>

#define NMAX 10000

#define RANGE 1000

void Print(unsigned n,unsigned a[]){ unsigned i;

i=1; while(i<=n){printf("%4u",a[i]);

if(!(i%480)){printf("Нажмите клавишу"); getch(); printf("\n");}i++;}

if(i%480){printf("\nНажмите клавишу"); getch(); printf("\n");}}

void BinarySort(unsigned n,unsigned a[]){ unsigned i,Nsort=0,as,bs,xs,Tmp;

while(++Nsort<n){Tmp=a[Nsort+1];

if(Tmp>=a[Nsort])continue;

if(Tmp<=a[1]){for(i=Nsort+1;i>=2;i--)a[i]=a[i-1];a[1]=Tmp;continue;}

as=1; bs=Nsort; xs=(as+bs)/2;

while(xs!=as&&xs!=bs){if(Tmp==a[xs]){bs=xs+1;break;}

if(Tmp<a[xs])bs=xs;else as=xs; xs=(as+bs)/2;}

for(i=Nsort+1;i>bs;i--)a[i]=a[i-1]; a[bs]=Tmp;}}

void main(void) { unsigned A[NMAX+1],n,i;

printf("\nВведите длину последовательности "); scanf("%i",&n);

randomize(); for(i=1;i<=n;i++)A[i]=random(RANGE);

Print(n,A); printf("Упорядоченная последовательность :\n");

BinarySort(n,A); Print(n,A);}

C Решение Задачи 4 на языке FORTRAN

SUBROUTINE $Print(n,A)

INTEGER*2 A(n)

nn=n/460

DO 1 i1=1,nn

PRINT 999,(A(i),i=(i1-1)*460+1,i1*460)

1 PAUSE'Нажмите ENTER'

IF(MOD(n,460).GT.0) THEN

PRINT 999,(A(i),i=nn*460+1,n)

PAUSE'Нажмите ENTER'

ENDIF

999 FORMAT(20I4)

END

SUBROUTINE BinarySort(n,a)

INTEGER*2 a(n),as,bs,xs,Tmp

Nsort=1

DO 99 WHILE(Nsort.LT.n)

Tmp=a(Nsort+1)

IF(Tmp-a(Nsort))1,99,99

1 IF(Tmp-a(1))2,2,3

2 DO 100 i=Nsort+1,2,-1

100 a(i)=a(i-1)

a(1)=Tmp

GOTO 99

3 as=1

bs=Nsort

xs=(as+bs)/2

DO WHILE(xs.NE.as.AND.xs.NE.bs)

IF (Tmp.EQ.a(xs)) THEN

bs=xs+1

EXIT

ENDIF

IF(Tmp.LT.a(xs)) THEN

bs=xs

ELSE

as=xs

ENDIF

xs=(as+bs)/2

END DO

DO 101 i=Nsort+1,bs+1,-1

101 a(i)=a(i-1)

a(bs)=Tmp

99 Nsort=Nsort+1

END

PARAMETER(Nmax=10000,Range=1000)

INTEGER*2 A(Nmax)

PRINT *,'Введите длину последовательности '

READ*,n

CALL GetTim(ih,im,is,is100)

CALL Seed(is*100)

DO 1 i=1,n

CALL Random(x)

1 A(i)=x*Range

CALL $Print(n,A)

PRINT*,'Упорядоченная последовательность :'

CALL BinarySort(n,A)

CALL $Print(n,A)

END

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]