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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.09.2009, 21:15   #1
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
Плохо Быстрая сортировка

Изучаю быструю сортировку, набрал код, начал компилировать. Что-то странно, всё написано правильно, уже проверял, 8 раз, программа компилируется, но результат отсортированного массива не выдаёт, выдаёт только исходный результат.

Код:
#include <iostream>
using namespace std;

void quicksort(char *items, int len);
void qs(char *items, int left, int right);

int main()
{
	setlocale(0,"");
	char str[] = "вгдба";
    cout<<"Масив в исходном порядке: "<<str<<endl;
	quicksort(str,strlen(str));
	cout<<"Отсортированный масив: "<<str<<endl;
cin.get();
}


void quicksort(char *items, int len)
{
	qs(items,0, len - 1);
}

void qs(char *items, int left, int right)
{
	int i,j;
	char x,y;
	i = left;	j = right;
	x = items[(left+right)/2];
	do {
		while((items[i] < x) && (i < right)); i++;
		while((x < items[j]) && (j > left)); j--;
    if(i<=j)
		{
			y = items[i];
			items[i] = items[j];
			items[j] = y;
			i++; j--;
		}
	} while(i <= j);

if(left < j) qs(items,left,j);
if(i < right) qs(items,i,right);
}
Syltan вне форума Ответить с цитированием
Старый 15.09.2009, 23:40   #2
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Код:
while((items[i] < x) && (i < right)); i++;
while((x < items[j]) && (j > left)); j--;
У вас тут вайлы не выполняют никаких операций из-за точки с запятой сразу после них) потому выходит бесконечный цикл.
Код:
while((items[i] < x) && (i < right)) i++;
while((x < items[j]) && (j > left)) j--;
стоит сделать так и всё правильно сортирует
netrino вне форума Ответить с цитированием
Старый 16.09.2009, 00:08   #3
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Спасибо за ответ netrino. Как мне например отсортировать 200 чисел случайных, которые выходят случайным образом и ещё ей же отсортировать буквы(200 штук случайных). Буду благодарен, за ответ. Прочитал,что ещё можно использовать какой-то template<class T>,не в курсе что это такое,какие-то вроде шаблоны,что-то они там делают. Вот код нашёл:

Код:
template<class T>
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
 
  long i = 0, j = N;            // поставить указатели на исходные места
  T temp, p;
 
  p = a[ N>>1 ];                // центральный элемент
 
  // процедура разделения
  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 ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i);
}

Не скажите,как реализовать задачу выше выделенную синим цветом?

Последний раз редактировалось Syltan; 16.09.2009 в 00:12.
Syltan вне форума Ответить с цитированием
Старый 16.09.2009, 00:31   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Шаблоны созданы для обобщений алгоритма на разные типы данных, на этапе компиляции они раскрываются и создаются необходимые виды ф-ций, оперирующие темы или иными видами данных, которые указываются в качестве параметра при использовании. Пример:
Код:
template<class T>
T max(T left, T right)
{
    return (left > right)? left : right;
}
...
max<int>(10, 15); // Вместо T подставляется int
max<char>('a', 'd'); // Вместо T подставляется char
При компиляции будет создано два варианта ф-ции max, один, который принимает в качестве параметров int, второй - char. В случаях, где можно однозначно определить какую ф-цию из шаблона следует создать, исходя из типов параметров, можно опустить <>: max(10, 10); max('a', 'd');
Так что ф-ция, которую вы привели в последнем посте рабочая
Код:
#include <iostream>

template<class T>
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
 
  long i = 0, j = N;            // поставить указатели на исходные места
  T temp, p;
 
  p = a[ N>>1 ];                // центральный элемент
 
  // процедура разделения
  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 ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i);
}

int main()
{
	setlocale(LC_ALL, "Russian");
	char str[] = "бвгда";
	quickSortR(str, strlen(str));
	std::cout << str << std::endl;
	int a[] = { 2, 5, 1, 20, 8, 0, 9 };
	quickSortR(a, 6);

	for(int i = 0; i < 7; i++)
		std::cout << a[i] << " ";

	std::cout << std::endl;

	return 0;
}

Последний раз редактировалось netrino; 16.09.2009 в 00:46.
netrino вне форума Ответить с цитированием
Старый 16.09.2009, 11:21   #5
colored
 
Регистрация: 08.09.2009
Сообщений: 6
По умолчанию

Цитата:
Сообщение от Syltan Посмотреть сообщение
Изучаю быструю сортировку, набрал код, начал компилировать. Что-то странно, всё написано правильно, уже проверял, 8 раз, программа компилируется, но результат отсортированного массива не выдаёт, выдаёт только исходный результат.

Код:
#include <iostream>
using namespace std;

void quicksort(char *items, int len);
void qs(char *items, int left, int right);

int main()
{
	setlocale(0,"");
	char str[] = "вгдба";
    cout<<"Масив в исходном порядке: "<<str<<endl;
	quicksort(str,strlen(str));
	cout<<"Отсортированный масив: "<<str<<endl;
cin.get();
}


void quicksort(char *items, int len)
{
	qs(items,0, len - 1);
}

void qs(char *items, int left, int right)
{
	int i,j;
	char x,y;
	i = left;	j = right;
	x = items[(left+right)/2];
	do {
		while((items[i] < x) && (i < right)); i++;
		while((x < items[j]) && (j > left)); j--;
    if(i<=j)
		{
			y = items[i];
			items[i] = items[j];
			items[j] = y;
			i++; j--;
		}
	} while(i <= j);

if(left < j) qs(items,left,j);
if(i < right) qs(items,i,right);
}
Из Шилдта пример? Я тоже его книгу читаю.
colored вне форума Ответить с цитированием
Старый 18.09.2009, 15:51   #6
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Если кто может,дополните коментарием вот этот,код,желательно как можно больше:

Код:
#include <iostream>
 
template<class T> //Что это,что оно даёт?
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
 
  long i = 0, j = N;            //Что это?
  T temp, p;                    //и это?
 
  p = a[ N>>1 ];                // Это вообще не понятно что   >>?
 
  // процедура разделения
  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 ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i); //Вот это тоже не ясно что делается
}
 
int main()
{
        setlocale(LC_ALL, "Russian");
        char str[] = "бвгда";
        quickSortR(str, strlen(str));
        std::cout << str << std::endl;
        int a[] = { 2, 5, 1, 20, 8, 0, 9 };
        quickSortR(a, 6);
 
        for(int i = 0; i < 7; i++)
                std::cout << a[i] << " ";
 
        std::cout << std::endl;
 
        return 0;
}
Syltan вне форума Ответить с цитированием
Старый 18.09.2009, 16:26   #7
LaptevVV
Пользователь
 
Регистрация: 15.08.2009
Сообщений: 37
По умолчанию

Цитата:
Сообщение от Syltan Посмотреть сообщение
Если кто может,дополните коментарием вот этот,код,желательно как можно больше:

Код:
#include <iostream>
 
template<class T> //Что это,что оно даёт?
void quickSortR(T* a, long N) {
// На входе - массив a[], a[N] - его последний элемент.
 
  long i = 0, j = N;            //Что это? Это объявление и инициализация целых переменных 
  T temp, p;                    //и это? 
Это объявление переменных шаблонного типа
 
  p = a[ N>>1 ];                // не понятно
это сдвиг вправо на 1. Если N положительное и беззнаковое, то деление на 2 
 
  // процедура разделения
  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 );
 
  // рекурсивные вызовы, если есть, что сортировать 
[b] это рекурсивный вызов той же функции с левой и правой половиной исходного массива
  if ( j > 0 ) quickSortR(a, j);
  if ( N > i ) quickSortR(a+i, N-i); //Вот это тоже не ясно что делается
}
 
int main()
{
        setlocale(LC_ALL, "Russian");
        char str[] = "бвгда";
        quickSortR(str, strlen(str));
        std::cout << str << std::endl;
        int a[] = { 2, 5, 1, 20, 8, 0, 9 };
        quickSortR(a, 6);
 
        for(int i = 0; i < 7; i++)
                std::cout << a[i] << " ";
 
        std::cout << std::endl;
 
        return 0;
}
Резюме. Читайте литературу!
По вопросам явно видно, что ни одной книжки по С++ вы не открывали.
LaptevVV вне форума Ответить с цитированием
Старый 18.09.2009, 17:35   #8
Syltan
Заблокирован
 
Регистрация: 27.08.2009
Сообщений: 569
По умолчанию

Если кто может, ответьте пожалуйста на 6 пост,очень нужно разобраться с сортировкой. Благодарю.
Syltan вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Быстрая сортировка Serious Общие вопросы Delphi 2 02.11.2010 13:38
Быстрая степень в с++ immor Общие вопросы C/C++ 3 25.05.2009 19:37
быстрая сортировка ГРИГОРИЙ-кореш Помощь студентам 1 16.04.2009 18:13
Быстрая работа с графикой Deight Мультимедиа в Delphi 3 13.01.2009 17:49
Быстрая сортировка списка ManU Паскаль, Turbo Pascal, PascalABC.NET 2 08.12.2008 11:57