Разработать программы сортировки статического и динамического наборов данных по алгоритму сортировки шейкера.
6.5.1 Текст программы. Сортировка динамических структур данных
#include<iostream.h> //cout
#include<stdlib.h> //random, malloc, free
#include<conio.h> //getch
#include<stdio.h>
#include<dos.h>
#define n 500
struct point
{
int zn;
point *pred;
point *next;
} *h,*e;
//Инициализация значения списка
int init(point *xh,point *xe)
{
int i;
point *a,*b;
randomize();
h=(point *)malloc(sizeof(point));
h->zn=random(100);
h->next=(point *)malloc(sizeof(point));
h->pred=NULL;
a=h;
cout<<"Инициализация\n";
cout<<h->zn<<"\n";
for(i=2;i<=n;i++)
{
b=a;
a->next=(point *)malloc(sizeof(point));
a=a->next;
a->zn=random(100);
cout<<a->zn<<"\n";
a->pred=b;
}
a->next=NULL;
e=a;
return (і);
}
void viv(point *xh,point *xe) //Выдача содержимого списка.
{
point *a;
cout<<"Вывести через NEXT\n";
a=h;
while(a!=NULL)
{
cout<<a->zn<<" ";
a=a->next;
}
}
void sort(point *xh,point *xe,int p,int napr)
{
int i;
point *a,*b;
if(napr) //прямое направление
{
a=xh;
p=1;
while(a!=NULL)
{
if(((a->zn)>(a->next->zn))&&(a->pred==NULL))
{
b=a->next;
a->next=b->next;
b->next->pred=a;
b->next=a;
a->pred=b;
b->pred=NULL;
xh=b;
h=b;
p=0;
}
if(((a->zn)>(a->next->zn))&&((a->next)!=NULL)&&(a!=NULL)&&(a->pred!=NULL))
{
b=a->next;
a->next=b->next;
b->pred=a->pred;
a->pred->next=b;
b->next->pred=a;
b->next=a;
a->pred=b;
if(a->next==NULL) {xe=a;e=a;}
p=0;
}
a=a->next;
} //for while, прямое направление
}
else //if(napz) обратное направление
{
a=xe; p=1;
while(a!=NULL)
{
if(((a->zn)<(a->pred->zn))&&(a->next==NULL))
{
b=a->pred;
a->pred=b->pred;
b->pred->next=a;
b->pred=a;
a->next=b;
b->next=NULL;
xe=e=b; p=0;
}
if(((a->zn)<(a->pred->zn))&&((a->pred)!=NULL)&&(a!=NULL)&&(a->next!=NULL))
{
b=a->pred;
a->pred=b->pred;
b->next=a->next;
a->next->pred=b;
b->pred->next=a;
b->pred=a;
a->next=b;
if(a->pred==NULL) {xh=a;h=a;}
p=0;
}
a=a->pred;
} //for while, обратное направление
} /for ELSE for if(napz)
if (napr==0) napr=1; else napr=0; //изменение направления сортировки
if(p==1) return;
sort(xh,xe,p,napr);
}
del(point *xh,point *xe)
{
point *a;
a=xh;
while(xh->next!=NULL)
{
while(a->next->next!=NULL)
a=a->next;
free(a->next);
a->next=NULL;
a=xh;
}
free(a);
cout<<"Список успешно удален из памяти.";
getch();
}
void main()
{ struct time t;
int t1,t2;
clrscr();
gettime(&t);
t1=t.ti_hund;
init(h,e);
sort(h,e,0,1);
gettime(&t);
t2=t.ti_hund;
printf("\nвремя выполнения сортировки %d секунд \n",t2-t1);
viv(h,e);
getch();
del(h,e);
}
Текст программы. Сортировка статических структур данных
#include<stdlib.h>
#include<conio.h>
#include<dos.h>
#include<stdio.h>
#define n 500 // количество элементов в массиве
int a[5]; // массив, содержимое которого будет упорядочиваться
void input()
{
int i;
randomize();
for(i=0; i<n; i++)
{
a[i]=random(99);
printf("%d " ,a[i]);
}
printf("\n");
}
void vivod()
{
int i;
for(i=0; i<n; i++)
printf("%d " ,a[i]);
printf("\n");
}
void sort()
{
int i,j,t;
int key;
key=1; // key - ключ, равен false, если не было перестановок
// (массив отсортирован)
for (i=1; i<n-1;i++)
{
if (!key) break;
key=0;
for (j=i; j<n-i;j++)
if (a[j]>a[j+1])
{
key=1;
t=a[j]; a[j]=a[j+1]; a[j+1]=t;
}
for (j=n-i;i;i--)
if (a[j]<a[j-1])
{
key=1;
t=a[j]; a[j]=a[j-1]; a[j-1]=t;
}
}
}
void main()
{ struct time t;
int t1,t2;
clrscr();
input();
gettime(&t);
t1=t.ti_hund;
sort();
gettime(&t);
t2=t.ti_hund;
printf("\nвремя выполнения сортировки %d секунд \n",t2-t1);
vivod();
getch();
}
Результаты работы программы
а) с динамическим набором данных:
Инициализация
73 33 92 17 27
Время выполнения сортировки 4 сек
17 27 33 73 92
Список успешно удален из памяти.
б) со статическим набором данных:
73 33 92 17 27
Время выполнения сортировки 11 сек
17 27 33 73 92