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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 18.01.2010, 15:19   #1
Paladast
Пользователь
 
Аватар для Paladast
 
Регистрация: 09.08.2009
Сообщений: 66
По умолчанию Сортировка массива

Доброе время суток.
В универе дали задание написать программу сортировки данных по алгоритму «шейкерная» сортировка.
Данные для сортировки вводятся в одномерный массив целых чисел. Сортировку реализовать пошагово, т.е. после каждого прохода алгоритма вывести массив на экран. Кроме того, вывести счетчики числа сравнений и числа перестановок за каждый проход и счетчики общего числа сравнений и общего числа перестановок.
Нашел готовую функцию,но не удовлетворен ее работой. Вот код:
Код:
#include<iostream>
#include<cmath>
using namespace std;
void ShakerSort(int n, int *a);
void main()
{
   int a[10];
   int n; 
   int i; 
   cout << "Enter n =";   
   cin >> n;
// Ввод массива

   for (i=0;i<n;i++)
   {
      cout << "a[" << i << "]=";
      cin >> a[i];
   }
	ShakerSort(n,a);
	cout<<endl;
	system("pause");
} 

void ShakerSort(int n, int *a)
{
   int i,j,k,x,l,r,p,ss,sp;
   l=1; r=n-1; p=0;
   do
   {  
     for (j=r; j>=l; j--)
		if (a[j-1]>a[j]) 
		{ x=a[j-1];
		  a[j-1]=a[j]; 	
		  a[j]=x;
		  i=j;
		}
     p++;
     l=i+1;
	 cout<<"\n"<<p<<" prochod"<<endl;
	 for (k=0; k<n; k++)
	  {
	      cout<<a[k]<<" ";
	  }
     for (j=l; j<=r; j++)
		if (a[j-1]>a[j]) 
		{ x=a[j-1];
		  a[j-1]=a[j]; 	
		  a[j]=x;
		  i=j; ss++;
		}
		r=i-1;
		p++;
	  cout<<"\n"<<p<<" prochod"<<endl;
	  for (k=0; k<n; k++)
	  {
	      cout<<a[k]<<" ";
	  }
   } while (l<=r);
}
Не могу реализовать счетчики,а также возникает вопрос почему даже если массив отсортирован он продолжает считать проходы,где ошибка? Подскажите пожалуйста,заранее спасибо.
Со мной бог и два пулемёта
Paladast вне форума Ответить с цитированием
Старый 18.01.2010, 16:21   #2
val_nnm
Форумчанин
 
Регистрация: 18.10.2009
Сообщений: 185
По умолчанию

Ну чтото вроде этого
Код:
void ShakerSort(int n, int *a)
{
	int i,j,k,x,l,r,p;
	l=1; r=n-1; p=0;
	i = n-1;
	int count_compare = 0;
	int count_exchange = 0;
	do
	{  
		for (j=r; j>=l; j--)
		{
			count_compare++;
			if (a[j-1]>a[j]) 
			{
				count_exchange++;
				x=a[j-1];
				a[j-1]=a[j]; 	
				a[j]=x;
				i=j;
			}
		}
		p++;
		l=i+1;
		cout<<"\n"<<p<<" prochod   "<<count_compare<<" obshee kolichestvo sravneniy       "<<count_exchange<<" obshee kolichestvo obmenov"<<endl;
		for (k=0; k<n; k++)
		{
			cout<<a[k]<<" ";
		}
		if (l<=r)
		{
			for (j=l; j<=r; j++)
			{
				count_compare++;
				if (a[j-1]>a[j]) 
				{
					count_exchange++;
					x=a[j-1];
					a[j-1]=a[j]; 	
					a[j]=x;
					i=j;
				}
			}
			r=i-1;
			p++;
			cout<<"\n"<<p<<" prochod   "<<count_compare<<" obshee kolichestvo sravneniy       "<<count_exchange<<" obshee kolichestvo obmenov"<<endl;
			for (k=0; k<n; k++)
			{
				cout<<a[k]<<" ";
			}
		}
	} while (l<=r);
}
На С# пишу лучше чем на русском.
"У меня правильнописание хромает. Оно хорошее, но почему-то хромает."
val_nnm вне форума Ответить с цитированием
Старый 18.01.2010, 16:28   #3
Paladast
Пользователь
 
Аватар для Paladast
 
Регистрация: 09.08.2009
Сообщений: 66
По умолчанию

Спасибо, работает. Очень помогли!
Со мной бог и два пулемёта
Paladast вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
С:Сортировка массива Crazy_caramel Помощь студентам 1 18.11.2009 23:15
Сортировка массива ManU Помощь студентам 1 21.09.2008 10:41
Сортировка массива С/С++ Dagget Помощь студентам 1 16.07.2008 12:18
Сортировка массива Kraven Общие вопросы Delphi 3 25.06.2008 18:22