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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.09.2010, 17:44   #1
daruwanov
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 11
По умолчанию сортировка массива строк.

Народ... Очень нужна помощь у меня есть динамический массив строк.

мне нужно отсортировать его точнее каждую строку в нем
тоесть как бы

mas[0]["привет"]
mas[1][''книга'']
.
.
.
итд

нужно что бы буквы в строках от сортировались по возрастною

mas[0]["веипрт"]
mas[1][''агикн'']
ну и т д ... Но и сделать это надо Сортировкой Шелла... вот с ней запутался что то в нете по находил кучу вариантов... но что то не осилю..
daruwanov вне форума Ответить с цитированием
Старый 21.09.2010, 18:03   #2
daruwanov
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 11
По умолчанию

Мне бы хотя бы нормальный доступный пример Сортировки Шелла...
daruwanov вне форума Ответить с цитированием
Старый 21.09.2010, 18:16   #3
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

На компьютере был код =) Шаг выбери сам для сортировки.
Код:
#include <iostream>
#include <time.h>
using namespace std;

int *shellSort(int *a, int n);

int main()
{
	int n;
	srand ( time(NULL) );
	cout << "Size: ";
	cin >> n;

	int *a = new int[n];
	for(int i = 0; i < n; i++)
	{ a[i] = rand() % 99; }

	a = shellSort(a,n);

	for(int i = 0; i < n; i++)
		cout << a[i] << " ";
	cout << endl;

        delete[] a;

	return 0;
}
/*-----Сортировка Шелла------*/
int *shellSort(int *a, int n)
{
	int k, x, j;
	const int h[5] = {9, 5, 3, 2, 1};

	///предложил Кнут
	///h[5] = {1, 4, 13, 40, 121};
	///h[5]{1, 3, 7, 15, 31}; 
	for(int m = 0; m < 5; m++)
	{
		k = h[m];
		for(int i = k; i < n; i++)
		{
			x = a[i]; j = i - k;
			while(x < a[j] && j >= 0) {a[j+k] = a[j]; j -= k; }
			a[j+k] = x;
		}
	}

	return a;
}
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Старый 21.09.2010, 18:22   #4
daruwanov
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 11
По умолчанию

а на что влияет шаг? Мне нужна максимально большая скорость сортировки... По поискам в нете Определился с этим методом - шаг как то влияет на скоростть?

И да.. спасибо за код..

Последний раз редактировалось Stilet; 21.09.2010 в 18:38.
daruwanov вне форума Ответить с цитированием
Старый 21.09.2010, 18:47   #5
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Выбор сортировки дело довольно сложное. А насчет шага можно почитать на википедии статью "Выбор длины промежутков": http://ru.wikipedia.org/wiki/%D0%A1%...BB%D0%BB%D0%B0
В книжке Кнута "Искусство программирования" 2 том довольно ясно объясняются все сортировки.
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶

Последний раз редактировалось dxdy; 21.09.2010 в 18:49.
dxdy вне форума Ответить с цитированием
Старый 21.09.2010, 18:56   #6
daruwanov
Пользователь
 
Регистрация: 31.08.2010
Сообщений: 11
По умолчанию

Попытался по аналогии сделать отсортировать строку
ну все что связано с массивом заменил с инта на чар

ну и в самой сортировке - приводил тип в (int) но когда приведение с право от = все ок но когда лево то не хочет... можно что то подсказать?
Код:
 #include <iostream>
#include <time.h>
using namespace std;

char *shellSort(char *chArray);

int main()
{
	
	char *chArray = new char[80];
	memset(chArray,0,80);
	strcat(chArray,"привет");

	strcat(chArray, shellSort(chArray));

	for(int i = 0; i < 80; i++)
		cout << chArray[i] ;
	cout << endl;

	delete[] chArray;

	return 0;
}
/*-----Сортировка Шелла------*/
char *shellSort(char *chArray)
{
	int k, x, j;
	const int h[5] = {9, 5, 3, 2, 1};

	///предложил Кнут
	///h[5] = {1, 4, 13, 40, 121};
	///h[5]{1, 3, 7, 15, 31}; 
	for(int m = 0; m < 5; m++)
	{
		k = h[m];
		for(int i = k; i < 80; i++)
		{
			x = (int)chArray[i]; j = i - k;

			while(x < (int)chArray[j] && j >= 0)
			{
				(int)chArray[j+k] = (int)chArray[j]; 
				j -= k;
			}
			(int)chArray[j+k] = x;
		}
	}

	return  chArray;
}

(int)chArray[j+k] = (int)chArray[j];
j -= k;
}
(int)chArray[j+k] = x;
}


вот тут все что слева(int)chArray[] нехочет приниматься компилятором

Последний раз редактировалось daruwanov; 21.09.2010 в 19:01.
daruwanov вне форума Ответить с цитированием
Старый 21.09.2010, 19:57   #7
dxdy
Пользователь
 
Регистрация: 11.06.2010
Сообщений: 78
По умолчанию

Если вы хотите сортировать буквы в массиве char, то можно попробовать сделать функцию на шаблоне. Только для сортировки русских букв, нужно учесть что они имеют "отрицательную" кодировку.
Код:
#include <iostream>
#include <time.h>
using namespace std;

template <class T>
T *shellSort(T *a, int n);

int main()
{
	char *a = new char[80];
	strcpy(a,"bac");
	int n = strlen(a);

	a = shellSort(a,n);

	for(int i = 0; i < n; i++)
		cout << a[i] << " ";
	cout << endl;

	delete[] a;

	return 0;
}
/*-----Сортировка Шелла------*/
template <class T>
T *shellSort(T *a, int n)
{
	int j, k;
    T x;
	const int h[5] = {9, 5, 3, 2, 1};

	///предложил Кнут
	///h[5] = {1, 4, 13, 40, 121};
	///h[5]{1, 3, 7, 15, 31}; 
	for(int m = 0; m < 5; m++)
	{
		k = h[m];
		for(int i = k; i < n; i++)
		{
			x = a[i]; j = i - k;
			while(x < a[j] && j >= 0) {a[j+k] = a[j]; j -= k; }
			a[j+k] = x;
		}
	}

	return a;
}
Только функцией strcpy лучше не увлекаться!
В вашем примере
Код:
for(int i = k; i < 80; i++)
лучше исправить на
Код:
for(int i = k; a[i] != '/0'; i++)
Я не волшебник, я еще только учусь ٩(๏̯͡๏)۶
dxdy вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сортировка массива строк в Си SpLIne Общие вопросы C/C++ 2 15.04.2010 16:17
Сортировка строк двухмерного массива EfiopianDIMON Общие вопросы C/C++ 9 26.05.2009 22:52
[С++] Сортировка 2ух строк двумерного массива. ReDev1L Помощь студентам 1 19.10.2008 03:45
Сортировка строк 2-мерного массива Mayday_007 Помощь студентам 1 04.04.2008 09:26
Сортировка массива строк StanPBH Помощь студентам 9 24.04.2007 00:34