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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.02.2011, 17:18   #1
Семен_Владимирович
 
Регистрация: 11.02.2011
Сообщений: 3
По умолчанию Сравнение алгоритмов сортировки массива

Всем доброго времени суток Получил задание в университете, выполнил его. Результатом не очень доволен, хотя явных ошибок не вижу...
Задача: сравнить алгоритмы сортировки умным пузырьком и "глупым".
Использую функцию timeGetTime для получения времени вычисления.
В теории так назваемый умный пузырек должен сортировать ощутимо быстрее. На практике же отличия в несколько микросекунд, причем разница не сильно меняется с увеличением массива. Иногда по результатам даже на больших массивах глупый пузырек сортирует быстрее Строю граффик в эксэле - линии практически совпадают...
Главный вопрос: В чем может крыться причина столь небольшого отличия скоорости?
Может конечно, это мои заморочки и все работает верно, но что- то мне так не кажется. Помогите кто чем может.
Код:
Код:
#include "stdafx.h"
#include <windows.h>
#include <mmsystem.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <iostream>
using namespace std;
#pragma comment(lib,"winmm.lib")

#define EXPSIZE 10
 
int _tmain(int argc, _TCHAR* argv[])
{
	setlocale (LC_ALL,"rus");
	srand (( unsigned ) time( NULL ));
	int const N = 1000;
	int Arr1[N];
	int Arr2[N];
	DWORD aver1 = 0;
	DWORD aver2 = 0;
	DWORD mSecArr1[10];
	DWORD mSecArr2[10];
	bool flag = false;

	int l = N; // бредок


		for(int ind = 0; ind < EXPSIZE; ind ++)
		{
			for (int i = 0; i < l; i++ ) // Заполнение и копирование массивов
			{
				Arr1[i] = rand();
				Arr2[i] = Arr1[i];
			} 

			mSecArr1[ind] = timeGetTime();

			for (int i = 0; i < l; i++ ) //Сортировка глупым пузырьком
			{
				for (int j= 0; j < l-1; j++ )
				{
					if (Arr1[j] > Arr1[j+1] )
					{
						int tmp = Arr1[j];
						Arr1[j] = Arr1[j+1];
						Arr1[j+1] = tmp;
					}
				}
			}

			mSecArr1[ind] = timeGetTime() - mSecArr1[ind];
			//cout << ind + 1 << ") Сортировка " << l << " элементов глупым способом = " << mSecArr1[ind] << endl; 
		
			mSecArr2[ind] = timeGetTime();

			do                                  //Сортировака умным пузырьком
			{
				flag = false;
				for( int j = 0; j < l - 1; j++ )
				{
					if ( Arr2[j] > Arr2[j + 1] )
					{
						int tmp = Arr2[j];
						Arr2[j] = Arr2[j+1];
						Arr2[j+1] = tmp;
						flag = true;
					}
				}
			} while ( flag );
		
			mSecArr2[ind] = timeGetTime() - mSecArr2[ind];
			//cout << ind + 1 << ") Сортировка " << l << " элементов умным способом = " << mSecArr2[ind] << "\n" << endl;
		}
			

		for(int ind = 0; ind < EXPSIZE; ind ++)
		{
			aver1 += mSecArr1[ind];
			aver2 += mSecArr2[ind];
			mSecArr1[ind] = 0; 
			mSecArr2[ind] = 0;
		}

		aver1 /= EXPSIZE;
		aver2 /= EXPSIZE;	

		cout << aver1 <<" - Среднее время глупой сортировки на длине ввода " << l << endl;
		cout << aver2 <<" - Среднее время умной сортировки на длине ввода " << l << endl << endl;
		aver1 = 0;
		aver2 = 0;

	return 0;
}
Семен_Владимирович вне форума Ответить с цитированием
Старый 15.02.2011, 18:44   #2
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Цитата:
В теории так назваемый умный пузырек должен сортировать ощутимо быстрее.
Почему? Поставьте счетчики числа обменов в первом и во втором случае.

Код:
...
  Arr1[j+1] = tmp;
  ++nswaps1;
...
  Arr2[j+1] = tmp;
  flag = true;
  ++nswaps2;
...
  cout << "swaps stupid: " << nswaps1 << " swaps clever: " << nswaps2 << endl;
И станет ясно, что "умный" пузырек не такой уж и умный.
Интересно еще замерить число сравнений, здесь "умный" пузырек чуточку лучше.
Д_М вне форума Ответить с цитированием
Старый 15.02.2011, 19:02   #3
Семен_Владимирович
 
Регистрация: 11.02.2011
Сообщений: 3
По умолчанию

Спасибо. Убедился. Бредок получается...
Семен_Владимирович вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Освоение алгоритмов сортировки элементов двумерных массивов. николай28 Паскаль, Turbo Pascal, PascalABC.NET 1 31.05.2010 22:30
Сравнение быстродействия алгоритмов Pti44ka Помощь студентам 9 13.11.2009 13:41
Алгоритм сортировки одномерного массива JOFRIF Общие вопросы C/C++ 4 19.07.2009 17:23
Из сортировки массива в сортировку матрици XXXimpulsXXX Помощь студентам 2 12.10.2008 15:11