Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Реализации различных алгоритмов на Си / метод подсчета + внешняя сортировка

.doc
Скачиваний:
17
Добавлен:
20.06.2014
Размер:
99.33 Кб
Скачать

2

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ

ГОСУДАРСТВЕННОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ

ВЫСШЕГО ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ

ЛИПЕЦКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

КАФЕДРА АВТОМАТИЗИРОВАННЫХ СИСТЕМ УПРАВЛЕНИЯ

Лабораторная работа №1

по дисциплине

«Технология программирования»

на тему:

«Программирование алгоритмов сортировки»

Студент

Филатов А.А.

подпись, дата

фамилия, инициалы

Группа

АС-09-1

Принял

Домашнев П.А.

ученая степень, звание

подпись, дата

фамилия, инициалы

Липецк 2010

  1. Задание

Осуществить программную реализацию сортировки информации заданного вида сбалансированным N-ленточным слиянием (в оперативной памяти), используя выбранные, в соответствии с вариантом, из табл. 1 алгоритм внутренней сортировки и формат исходных данных.

Вариант

ключ

Запись

0 – только ключ, 1 – ключ и другие данные различных типов

Метод внутренней сортировки

18

char[]

0

4

Метод подсчета (4)

Метод основан на том, что k+1-ый элемент упорядоченной последовательности превышает ровно k элементов, и следовательно занимает k+1-ую позицию. В процессе сортировки на каждом i-ом проходе i-ый элемент исходной последовательности попарно сравнивается со всеми остальными элементами. Инициализированный нулем перед началом прохода счетчик k увеличивается, если i-ый элемент оказался больше текущего. Таким образом, порядковый номер i-го элемента, по окончанию i-го прохода, равен k+1. Для сортировки последовательности из N элементов требуется N проходов, на каждом из которых выполняется N сравнений. Число сравнений равно N2. Приведенный метод подсчета можно использовать, если достоверно известно, что в исходно последовательности нет записей с одинаковыми ключами.

  1. Листинг программы

#include <stdio.h>

#include <conio.h>

#include <locale.h>

#include <stdlib.h>

#include <math.h>

void main()

{

setlocale(LC_ALL, "Russian");

int i,j,k,r,kolvo_strok=0, kolvo_sym=0,q,*Vsp,d,p, s[4];

char **Mass, ch, **Mass_new;

printf("Введите количество строк, такое, что kоличество/4=целому числу: ");

scanf("%d", &kolvo_strok);

printf("Введите количество символов в строке:");

scanf("%d", &kolvo_sym);

Mass=(char **)malloc(kolvo_strok*sizeof(char));

for(i=0;i<kolvo_strok;i++)

Mass[i]=(char *)malloc(kolvo_sym*sizeof(char));

Mass_new=(char **)malloc(kolvo_strok*sizeof(char));

for(i=0;i<kolvo_strok;i++)

Mass_new[i]=(char *)malloc(kolvo_sym*sizeof(char));

if(!Mass_new)

{

printf("Ошибка 0: память не выделена!");

getch();

exit(1);

}

if(!Mass)

{

printf("Ошибка 1: память не выделена!");

getch();

exit(1);

}

Vsp=(int *)malloc(kolvo_strok*sizeof(int));

if(!Vsp)

{

printf("Ошибка 2: память не выделена!");

getch();

exit(1);

}

for(i=0;i<kolvo_strok;i++)

{

re: printf("\nВведите %d символов английского алфавита %d-й строки: ",kolvo_sym,i+1);//ввод массива

for(j=0;j<kolvo_sym;j++)

{

ch=getch();

printf("%c",ch);

if((ch>=65)&&(ch<=122))

Mass[i][j]=ch;

else

{

printf("\nНеправильный ввод, повторите:");

goto re;

}

}

}

for(r=1;r<=4;r++)//сортировка четырех частей массива по отдельности

{

for(i=((r-1)*kolvo_strok/4);i<(r*kolvo_strok/4);i++)/*определение упорядоченных позиций в файлах*/

{

k=0;

for(j=((r-1)*kolvo_strok/4);j<(r*kolvo_strok/4);j++)

if(Mass[i][0]>Mass[j][0])

k++;

Vsp[i]=k;

}

p=0;

k=0;

for(i=((r-1)*kolvo_strok/4);i<(r*kolvo_strok/4);i++)//перестановка

{

for(j=((r-1)*kolvo_strok/4);j<(r*kolvo_strok/4);j++)

if(Vsp[j]==p)

d=j;

p++;

for(q=0;q<kolvo_sym;q++)

{

ch=Mass[d][q];

Mass[d][q]=Mass[i][q];

Mass[i][q]=ch;

}

k=Vsp[i];

Vsp[i]=Vsp[d];

Vsp[d]=k;

}

}

/*теперь мы получили массив, каждая из четырех частей которого упорядочена методом подсчета, теперь надо упорядочить весь массив, для этого используется способ слияния лент*/

for(i=0;i<4;i++)//инициализация счетчиков

s[i]=i*kolvo_strok/4;

k=0;

for(i=0;i<kolvo_strok;i++)//сортировка слинием лент

{

ch='z';

for(j=0;j<4;j++)//поиск наименьшего элемента

if((s[j]!=-1)&&(ch>=Mass[s[j]][0]))

{

ch=Mass[s[j]][0];

d=j;

}

for(j=0;j<kolvo_sym;j++)

Mass_new[k][j]=Mass[s[d]][j];//присвоение строки новому массиву

k++;

s[d]=s[d]+1;//увеличивание счетчика

if(s[d]==(d*kolvo_strok/4)+kolvo_strok/4)//если счетчик достиг предела

s[d]=-1;

}

for(i=0;i<kolvo_strok;i++)//вывод

{

printf("\n");

for(j=0;j<kolvo_sym;j++)

printf("%c",Mass_new[i][j]);

}

getch();

}