Консультация № 146393
07.10.2008, 22:14
0.00 руб.
0 0 0
Здравствуйте глубоко уважаемые эксперты.

Помогите пожайлуста с одной маленькой проблемкой.

Задание изначально было таким:

Разработать программу на языке «Си», реализующую четыре различных алгоритма сортировки одномерного целочисленного массива. Массив является динамическим, размерность указывается пользователем при запуске программы. Массив должен быть заполнен по выбору пользователя одним из трех вариантов:

• по возрастанию
• по убыванию
• случайными целыми числами в диапазоне от 0 до 100

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

После работы алгоритма сортировки, на экран должна быть выведена суммарная информация о результатах его работы, содержащая время работы алгоритма, количество операций сравнения и количество операций присвоения.
Так как для небольших массивов время работы алгоритмов может быть очень незначительным, для сравнения времени работы сортировок над такими массивами, необходимо некоторое число K повторить сортировку исходного массива одним алгоритмом сортировки. После этого суммарное время сортировки поделить на число K и таким образом получить время работы одного прохода алгоритма сортировки. Число K вводится пользователем.

Операции сравнения и присвоения должны быть реализованы в виде функций, функции единственны для всех алгоритмов сортировки.

В данном случае четырьмя различными алгоритмами сортировки одномерного целочисленного массива являются следующие её виды:
1. Пузырьковая сортировка.
2. Сортировка вставкой.
3. Сортировка выбором.
4. Поразрядная сортировка.

Код сделанной программы смотрите в приложении.

Сечас необходимо, чтобы операции привоения и сравнения были реализованы через функцию или через две различные функции, а в функциях сортировки их можно было бы вызвать и использовать.

Заранее спасибо.


Приложение:
#include <iostream.h>
#include <stdlib.h>
#include <time.h>

int dim, rep, n_comp, n_assign;
double t_prog;
int ar1[50], ar2[50], ar3[50];

int test_sorting(int arr, int arr_dim, int prog, long repeat);
int bubble_sort(int *b, int dim);
int insert_sort(int *b, int dim);
int select_sort(int *b, int dim);
int digit_sort(int *b, int dim);

int swap(int a, int b);
//int assign(int a, int b);
int menshe(int a, int b);
//int menshe_rav(int a, int b);
//int rav(int a, int b);

int main()
{
int i, nom_arr, prog;
cout << "Vvedite razmernost massiva: ";
cin >> dim;
cout << "\nVvedite kolichestvo povtorenij sortirovki: ";
cin >> rep;

//Построение массивов
//// Начальные элементы массивов
srand(time(NULL)); //инициализация датчика соучайных чисел
ar1[0]=rand() % 1000;
ar2[0]=rand() % 1000;
ar3[0]=rand() % 100;
//// Остальные элементы
for (i=1; i<dim; i++)
{
ar1[i]=ar1[i-1]+1;
ar2[i]=ar2[i-1]-1;
ar3[i]=rand() % 100;
}
//// Печать массивов
for (i=0; i<dim; i++)
{
cout << ar1[i] << '\t';
cout << ar2[i] << '\t';
cout << ar3[i] << '\n';
}

// Проверка подпрограмм сортировки
nom_arr = 1;
while (nom_arr < 4 && nom_arr > 0)
{
cout << "Ukazhite nomer massiva. Dla okonchania" << endl;
cout << "raboty vvedite otricatelnoye chislo: ";
cin >> nom_arr;
if (nom_arr < 0) return (0);
cout << "\n 1. Puzyrkovaja sortirovka ";
cout << "\n 2. Sortirovka vstavkoi";
cout << "\n 3. Sortirovka vyborom";
cout << "\n 4. Porazriadnaia sortirovka ";
cout << "\n Ukazhite nomer programmy sortirovki: ";
cin >> prog;

n_assign = 0; n_comp = 0;
test_sorting(nom_arr, dim, prog, rep);

cout << endl << endl << "Time = ";
cout.setf(ios::scientific);
cout << t_prog;
cout.unsetf(ios::scientific);
cout << "mks. Prisvojenij - " <<(n_assign / rep / rep);
cout << ". Sravnenij - " << (n_comp / rep / rep) << endl;

}

return 0;
}

int test_sorting(int arr_no, int arr_dim, int prog, long repeat)
{
long i,j; int k;
int ar[100];
time_t time0, time1;
time0 = time(NULL); // Момент начала работы подпрограммы
for (i=0; i<repeat; i++)
for (j=0; j<repeat; j++)
{
// Восстановление упорядочиваемого массива
switch (arr_no)
{
case 2:
for (k=0; k<arr_dim; k++)
ar[k]=ar2[k];
break;

case 3:
for (k=0; k<arr_dim; k++)
ar[k]=ar3[k];
break;

default:
for (k=0; k<arr_dim; k++)
ar[k]=ar1[k];
break;
}

// Выбор программы
switch (prog)
{
case 2:
insert_sort(ar,arr_dim);
break;

case 3:
select_sort(ar,arr_dim);
break;

case 4:
digit_sort(ar,arr_dim);
break;

default:bubble_sort(ar,arr_dim);
break;
}

}
time1 = t_prog; //Момент конца работы подпрограммы
t_prog = (time1 - time0)*1000*1000/((double)repeat)/((double)repeat);
//Время - в микросекундах
cout << endl << endl;
for (i=0; i<arr_dim; i++)
cout << ar[i] << '\t';
return 0;
}
int bubble_sort(int *b, int dim)
{
int i,j,mmm;
for (i=1; i<dim; i++)
for (j=1; j<=dim-i; j++)
if (menshe(b[j], b[i-1])) //b[j-1] > b[j]
{
// Перестановка большего и меньшего
mmm=b[j-1];
b[j-1]=b[j];
b[j]=mmm;
n_assign+=3;
}
return(0);
}

int insert_sort(int *b, int dim)
{
int i,j,mmm;
for (i=1; i<dim; i++)
{
mmm=b[i];
n_assign++;
// Элементы массива до i-го, которые больше b[i], сдвигаются
// вправо
for (j=i; j>0 && menshe(mmm, b[j-1]); j--) //b[j-1]>mmm
{
b[j]=b[j-1];
n_assign++;
}
// и затем b[i] ставится на освободившееся место
b[j]=mmm;
n_assign++;
}
return(0);
}

int select_sort(int *b, int dim)
{
int i, j, i_min, mmm;
for (i=0; i<dim-1; i++)
{
i_min=i;
n_assign++;
// Ищется наименьший элемент справа от i-го
for (j=i+1; j<dim; j++)
if (menshe(b[j], b[i_min])) //b[j] < b[i_min]
{
i_min=j;
n_assign++;
}
// и меняется местами с b[i]
mmm = b[i_min];
b[i_min] = b[i];
b[i] = mmm;
n_assign += 3;
}
return(0);
}

// Поразрядная сортировка
int digit_sort(int* b, int dim)
{
int dg_add(int *c1, int *c2, int dim, int pos);
int i, div;
int bb[100];
div = 1;
for (i=0; i<4; i++)
{
// Производится сортировка элементов только по одномк
// разряду и результат записывается в bb
dg_add(b,bb,dim,div);
div *= 10;
// Производится сортировка элементов bb по следующему
// слеа разряду и результат записывается в bи
dg_add(bb,b,dim,div);
div *= 10;
}

return(0);
}

int dg_add(int *c1, int *c2, int dim, int div)
{
int i, k;
int cnt[11];
// Подсчет количества чисел, имеющих цифру k в разряде lg(div)-1 справа
for (i=0; i<11; i++) cnt[i]=0;
for (i=0; i<dim; i++)
{
k=(c1[i] / div) % 10;
cnt[k+1]++;
n_assign++;
}
// Накопленные суммы в cnt
for (i=1; i<11; i++)
{
cnt[i]+=cnt[i-1];
n_assign++;
}
// Заполнение 2-го массива
for (i=0; i<dim; i++)
{
k=(c1[i] / div) % 10;
// k=(int)(c1[i] / pow(10, pos - 1)) % 10;
c2[cnt[k]++] = c1[i];
n_assign++;
}
return(0);
}

int menshe(int a, int b)
{
n_comp++;
if (a<b) return(1);
else return(0);
}



int rav(int a, int b)
{
n_comp++;
if (a==b) return(1);
else return(0);
}

Обсуждение

Форма ответа