Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.10.2013, 19:05   #1
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию C++ сравнение методов сортировки одномерного массива и таймер

Здравствуйте.
Помогите, пожалуйста, решить задачу по программированию:

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

Начала решать задачу с самой простой сортировки - пузырьковой. Хоть убейте, другие сортировки я не понимаю! (непонятен сам алгоритм). Но на текущий момент проблема даже не в этом.
Дело в том, что я пытаюсь засечь время выполнения пузырьковой сортировки малого массива из 15 элементов. Оно равно нулю. Я пробовала разные способы, но результат такой: либо 0, либо не компилируется.

Программу пишу c помощью Visual Studio.

Код:
#include <iostream>
#include <stdio.h>
#include <time.h>

using namespace std;

int main()
{
	int arr_m[15];
	int res = 0;
	clock_t start;
	clock_t stop;
	for (int i = 0; i < 15; ++i)
	{
		arr_m[i] = rand()%15 - 5;
	}
	cout<<"Dannyj massiv:"<<endl;
	for (int i = 0; i < 15; ++i)
	{
		cout<<arr_m[i]<<"; ";
	}
	cout<<endl;
	start = clock();
	for (int i = 1; i < 15; i++) 
	{
		for (int j = 0; j < 15 - i; j++) 
		{
			if (arr_m[j] > arr_m[j + 1])
			{ 
				res = arr_m[j]; 
				arr_m[j] = arr_m[j + 1]; 
				arr_m[j + 1] = res; 
			}
		}
	}
	stop = clock();
	cout<<"Novyj massiv:"<<endl;
	for (int i = 0; i < 15; ++i)
	{
		cout<<arr_m[i]<<"; ";
	}
	cout<<endl;
	long double time = long double ((stop - start) / CLOCKS_PER_SEC);
	cout<<"Vremja sortirovki: "<<time<<endl;
	
	system ("pause");
	return 0;
}
Объясните, пожалуйста, в чем проблема.
Bitter_Schokolade вне форума Ответить с цитированием
Старый 12.10.2013, 20:14   #2
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Может быть массив маловат. Слишком быстро сортируется, бистрее, чем 1 " клок ".
Чему там у Вас равно CLOCKS_PER_SEC ?
Я C++ почти совсем не знаю. Но чисто ради интереса сравнивал разные методы сортировки на Delphi. Использовал тип TDateTime. Тоже иногда получался 0, приходились один и тот же массив сортировать по многу раз, чтобы получить время.
Например, методом пузырька массив в 10 элементов - 0.0000045 секунд, в 30 элементов - 0.000035, .... в 3000 элементов - 0,32 сек.
Цифры разные получались, даже если постоянно брать тот же массив. От загрузки процессора наверное зависит.
type_Oleg вне форума Ответить с цитированием
Старый 13.10.2013, 11:11   #3
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

А пробовала с разными размерностями массива, но результат один. При выводе на экран значений start и stop они оба равны 109.

Только когда я отладку запускаю, тогда у меня ответ получается отличным от нуля.

Последний раз редактировалось Bitter_Schokolade; 13.10.2013 в 11:21.
Bitter_Schokolade вне форума Ответить с цитированием
Старый 13.10.2013, 12:26   #4
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Добавила в код сортировку вставками (вроде правильно, могу ошибаться)
Время исполнения сортировки равно нулю в обоих случаях.
Код:
#include <iostream>
#include <stdio.h>
#include <time.h>

using namespace std;

void puz_sort (int arr_m[15])
{
	for (int i = 1; i < 15; i++) 
	{
		for (int j = 0; j < 15 - i; j++) 
		{
			if (arr_m[j] > arr_m[j + 1])
			{ 
				int res = arr_m[j]; 
				arr_m[j] = arr_m[j + 1]; 
				arr_m[j + 1] = res; 
			}
		}
	}
}

void vst_sort (int arr_m[15])
{
	for (int i = 1; i < 15; i++)
	{
		int res = arr_m[i];
		for (int j = i-1; j >= 0 && res < arr_m[j] ; j--)
		{
			arr_m[j+1] = arr_m[j];
			arr_m[j+1] = res;
		}
	}

}

int main()
{   
	int arr_m[15];

	for (int i = 0; i < 15; ++i)
	{
		arr_m[i] = rand()%15 - 5;
	}
	cout<<"Dannyj massiv:"<<endl;
	for (int i = 0; i < 15; ++i)
	{
		cout<<arr_m[i]<<"; ";
	}
	cout<<endl;
	clock_t start1 = clock();
	puz_sort(arr_m);
	clock_t stop1 = clock();

	cout<<endl;
	long double time1 = long double (stop1 - start1);
	cout<<"Vremja sortirovki (puz_sort): "<<time1<<endl;

	clock_t start2 = clock();
	vst_sort(arr_m);
	clock_t stop2 = clock();

	cout<<endl;
	long double time2 = long double (stop2 - start2);
	cout<<"Vremja sortirovki (vst_sort): "<<time2<<endl;

	system ("pause");
	return 0;
}
Bitter_Schokolade вне форума Ответить с цитированием
Старый 13.10.2013, 13:01   #5
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Bitter_Schokolade Посмотреть сообщение
Время исполнения сортировки равно нулю в обоих случаях.
[
Вы хотите в секундах отследить сортировку массива разметом 15 байт? )))

Возмите массив в 3 мегабайта, а потом сравнивайте.
rlib вне форума Ответить с цитированием
Старый 13.10.2013, 15:01   #6
Bitter_Schokolade
Несчастный студент
Пользователь
 
Аватар для Bitter_Schokolade
 
Регистрация: 31.03.2013
Сообщений: 52
По умолчанию

Отсчет в секундах? А в 10^-3 сек как сделать?

Последний раз редактировалось Bitter_Schokolade; 13.10.2013 в 15:06.
Bitter_Schokolade вне форума Ответить с цитированием
Старый 13.10.2013, 18:13   #7
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Bitter_Schokolade, все таки Вы недооцениваете быстроедействие нонешних компьютеров. Особенно с целочисленными массивами. В то время, когда космические корабли бороздят просторы ...

rlib, 3 Мбайта - это конечно слишком. У сортировки время обычно пропорционально квадрату объема массива.

Код:
#include <iostream>
#include <stdio.h>
#include <time.h>
#include <cstdlib>
#define NMAS 1000
using namespace std;

int main()
{
	int arr_m[NMAS];
	int res = 0;
	clock_t start;
	clock_t stop;
	for (int i = 0; i < NMAS; ++i)
	{
		arr_m[i] = rand()%NMAS - 5;
	}
	cout<<"Dannyj massiv:"<<endl;
	for (int i = 0; i < NMAS; ++i)
	{
		cout<<arr_m[i]<<"; ";
	}
	cout<<endl;
	start = clock();
	for (int i = 1; i < NMAS; i++) 
	{
		for (int j = 0; j < NMAS - i; j++) 
		{
			if (arr_m[j] > arr_m[j + 1])
			{ 
				res = arr_m[j]; 
				arr_m[j] = arr_m[j + 1]; 
				arr_m[j + 1] = res; 
			}
		}
	}
	stop = clock();
	cout<<"Novyj massiv:"<<endl;
	for (int i = 0; i < NMAS; ++i)
	{
		cout<<arr_m[i]<<"; ";
	}
	cout<<endl;
	double tim = double(stop - start) / CLOCKS_PER_SEC;  // вот так
	cout<<"Vremja sortirovki: "<<tim<<endl;
	
	system ("pause");
	return 0;
}
Найдите 10 различий.
И результат:
Изображения
Тип файла: jpg sort00.jpg (103.3 Кб, 101 просмотров)
type_Oleg вне форума Ответить с цитированием
Старый 13.10.2013, 18:13   #8
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Цитата:
Сообщение от Bitter_Schokolade Посмотреть сообщение
Отсчет в секундах? А в 10^-3 сек как сделать?
С помощью АНСИ Ц вам не удасться получить временную резолюцию больше секунды. Смотрите time.h..

Решений 2.
Либо возьмите больший массив, чтобы потратить больше, чем 1 сек на сортировку. Либо пользуйте системные функции (под Винду или Линукс, в зависимости, где запускаете прогу) для большей резолюции по времени.
rlib вне форума Ответить с цитированием
Старый 13.10.2013, 18:28   #9
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вот пользуйтесь. Пример программы сортировки.
Код:
// Инициализация таймера замера времени выполнения алгоритма
LARGE_INTEGER freq;
QueryPerformanceFrequency(&freq);
LARGE_INTEGER time1;
QueryPerformanceCounter(&time1);

// Необходимые расчёты

// Снятие показаний таймера
LARGE_INTEGER time2;
QueryPerformanceCounter(&time2);
time2.QuadPart -= time1.QuadPart;
double span = (double) time2.QuadPart / freq.QuadPart;

span = span * pow(10,9);// Результат
Результат в наносекундах.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 13.10.2013 в 18:37.
Smitt&Wesson вне форума Ответить с цитированием
Старый 13.10.2013, 18:38   #10
type_Oleg
Старожил
 
Аватар для type_Oleg
 
Регистрация: 02.03.2008
Сообщений: 2,499
По умолчанию

Кстати, чтобы rand каждый раз выдавала разные значения, надо еще вызывать srand.
type_Oleg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать программу сортировки одномерного массива методом двоичного включения Lera_94 Помощь студентам 0 02.05.2013 15:42
Блок-схема сортировки одномерного массива roperd Общие вопросы Delphi 1 11.12.2011 11:12
сортировки одномерного массива целых чисел методом подсчета сравнений [Паскаль] sm0ker Помощь студентам 13 16.12.2010 22:40
Алгоритм сортировки одномерного массива JOFRIF Общие вопросы C/C++ 4 19.07.2009 17:23