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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.03.2013, 12:05   #11
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Не совсем мне приспичело - препод)))
Может, условие полностью переделать или цикл.

Просто, зачем равно в ифе, если не переставляет? - и вот этим вопросом по 10 кругу. Надо. Надо его до пн сделать и удивить.
Fanyuus вне форума Ответить с цитированием
Старый 22.03.2013, 12:17   #12
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
зачем равно в ифе, если не переставляет?
наоборот. Без равно не переставляет, с равно - переставляет. Затем и равно, чтоб переставляло. Это Вам препод вопрос задает или требует без равно сделать?
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.03.2013, 12:21   #13
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Вот Вам функция быстрой сортировки, нагло содранная из википедии:

Код:
  //алгоритм на языке java и с//с++ 
  public static void qSort(int[] A, int low, int high) {
      int i = low;                
      int j = high;
      int x = A[(low+high)/2];  // x - опорный элемент посредине между low и high
      do {
          while(A[i] < x) ++i;  // поиск элемента для переноса в старшую часть
          while(A[j] > x) --j;  // поиск элемента для переноса в младшую часть
          if(i <= j){           
              // обмен элементов местами:
              int temp = A[i];
              A[i] = A[j];
              A[j] = temp;
              // переход к следующим элементам:
              i++; j--;
          }
      } while(i < j);
      if(low < j) qSort(A, low, j);
      if(i < high) qSort(A, i, high);
  }
Здесь While без знака "=", но ведь и цикл с постусловием + еще и рекурсивный вызов функции используется.. А вот if, как ни старайся, без равно не оставишь
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.03.2013, 12:51   #14
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Вредный препод, он все эти коды знает. Треьбуует без равно.

Меня вот какая мысль осенила - может в иф засунуть не i и j , а массивы с этими индексами?
Fanyuus вне форума Ответить с цитированием
Старый 22.03.2013, 12:58   #15
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Вредный препод, он все эти коды знает
И чего? Он от Вас требует изобрести новый вариант одного и того же алгоритма?

Ну напишите вот так это условие:

Код:
if (i<j)||(i==j)
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 22.03.2013, 13:17   #16
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Да, вот он спрашивает и сам говорит, что там равно бессмысленно. Убираем равно из ифа - делает нагловредное выражение лица и так "о, не идёт?"

Может заменить, условие на "пока не равно"? А если пролетит.. Хм, вот я и думаю - как избавиться, хитро спрятать и так далее
Fanyuus вне форума Ответить с цитированием
Старый 22.03.2013, 15:29   #17
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

нашла вот такой код:

Код:
do {
    while ( a[i] < p ) i++;
    while ( a[j] > p ) j--;
 
    if (i < j) {
      temp = a[i]; a[i] = a[j]; a[j] = temp;
      i++; j--;
    }
  } while ( i < j );
 
  if (i == j) {
    while ( a[i] < p ) i++;
    while ( a[j] > p ) j--;
 
    if (i == j) {
      i++; j--;
    }
  }
они это "=" рассматривают отдельно. Что меня натолкнуло на мысль - везде идёт сравнение с числом в массиве, а может не смещать "а и b", а сводить их до индекса опорного элемента, если ничего не поменялось, а до индекса мы с какой-нибудь стороны дошли, запустить сорту с выбором опорного элемента в том подмассиве?

Хотя звучит это ужасней, чем тупо оставить "=" и объяснить зачем оно там...
Тогда надо "придумать" случай с равно. Ещё один элс к ифу?

Надо ж "дойти до этого самой"))
Fanyuus вне форума Ответить с цитированием
Старый 22.03.2013, 19:21   #18
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

На самом деле то, что Вы описали - это и есть рекурсия. В содранном мною с вики примере, который выше, как раз она и используется. Это когда функция вызывает сама себя с другими параметрами.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 28.03.2013, 06:45   #19
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Так оно и понятно, что там рекурсивный вызов функции.
Всё равно никак не могу понять - чего ж это такое мистическое равно тут.)

*хотя нет, взглянула на свой код ещё раз и подумала: ан нет, вроде бы поняла))
Но Вам, Sciv, всё равно большое спасибо!))
Fanyuus вне форума Ответить с цитированием
Старый 28.03.2013, 07:12   #20
Fanyuus
Форумчанин
 
Аватар для Fanyuus
 
Регистрация: 07.05.2011
Сообщений: 169
По умолчанию

Коллеги! Помогите мне ещё вот в чём:

Код:
#include "stdafx.h"
#include <conio.h> 
#include <iostream> 
#include <Windows.h>

using namespace std;
void qw_sorta(int *mas, int l, int r); 

void main ()
{
	setlocale (0,"");

	int i,t,a;
	cout << "Введите размер массива: ";
	cin >> t;
	int *mas=new int[t];
cout << "\n\nМассив до сортировки: ";
for (i=0; i<t; i++)
{
	mas[i]=rand() % 50;
	cout << mas[i] << " ";
}

int l=0, r=t-1;

	
qw_sorta(mas, l, r); 

	for (i=0; i<t; i++)
			{
				cout << mas[i] << " ";
			}
	
	cin.get();
	cin.get();
}



//быстрая сортировка
void qw_sorta(int *mas, int l, int r)
{

	int a=l, b=r, d=0, id=0, f=12;
	d=mas[(a+b)/2]; 
	cout << b << " " << f;
	cin.get();
	
	if ((b-a!=1)||(b-a!=2))
	{
		while (a<b)
		{

			if (mas[a]<d)
			{
				a++;
			}
			if (mas[b]>d)
			{
				b--;
			}
			
			//когда А<Б, то получается так, что ваил ещё раз работает, налазит на элемент и если 
			

			if (a<b)
			{
				int s;
				s=mas[a];
				mas[a]=mas[b];
				mas[b]=s;			
				a++;
				b--;
			}
		}
	

		if (l<b)
		{
			qw_sorta(mas,l,b);
		}
		if (a<r)
		{
			qw_sorta(mas,a,r);
		}
	}
	else
	{
		if (b-a==1)
		{
			if (mas[a]>mas[a+1])
			{
				int s;
				s=mas[a];
				mas[a]=mas[a+1];
				mas[a+1]=s;			
			}
		}
		if(b-a==2)
		{
		
				if (mas[a+1]>mas[a+2])
				{
					int s;
					s=mas[a+1];
					mas[a+1]=mas[a+2];
					mas[a+2]=s;			
				}
				if (mas[a+1]<mas[a])
				{
					int s;
					s=mas[a];
					mas[a]=mas[a+1];
					mas[a+1]=s;			
				}
				if (mas[a+1]>mas[a+2])
				{
					int s;
					s=mas[a+1];
					mas[a+1]=mas[a+2];
					mas[a+2]=s;			
				}
			}
		}
}
почему при первом разе, простого вывода чего-либо, он выдаёт мне какие-то странные значения (есть подозрение. что несколько элементов печатает из массива) ?

Ух ты, зато таким способом можно отследить бесконечность)) не знала, не знала))

Последний раз редактировалось Fanyuus; 28.03.2013 в 07:15.
Fanyuus вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Алгоритм сортировки BarsRus Помощь студентам 3 03.06.2010 16:11
Самый быстрый вид сортировки массива Warnes Свободное общение 42 06.12.2009 16:02
самый быстрый метод сортировки, который расположит в порядке возврастания 50.000 чисел типа real Rusl92 Помощь студентам 8 21.11.2009 20:50
Быстрый алгоритм для вычисления синуса RIO Помощь студентам 10 17.12.2007 14:33
Предложите самый быстрый алгоритм! Gambler Общие вопросы Delphi 6 26.12.2006 22:44