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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.04.2010, 23:25   #1
MafoR
Пользователь
 
Регистрация: 25.01.2010
Сообщений: 11
По умолчанию Нестандартная сортировка массива.

Всем доброго времени суток. Возник такой вопрос, как будет правильнее организовать сортировку массива, к примеру, вот такого вида 51655 в 55516 или 22622 в 22226. Значение чисел в массиве от 1 до 6, кол-во эл-ов 5. Идей как можно написать данную сортировку, к сожалению, пока нету =( но постоянно нахожусь в процессе обдумывания этой задачи =) Помогите, пожалуйста, заранее благодарю.
MafoR вне форума Ответить с цитированием
Старый 13.04.2010, 23:28   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Алгоритм понял. Стучи в асю. За небольшую сумму реализую.
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 13.04.2010, 23:39   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Если я верно понял, то можно вот так:
Код:
#include <iostream>
#include <ctime>

int getEqual(const int* v, int length, int index_beg)
{
	int index = -1;
	int value = v[index_beg];

	for(int i = index_beg + 1; i < length; i++) {
		if(value == v[i]) {
			index = i;
			break;
		}
	}

	return index;
}

int main()
{
	const int len = 10;
	int v[len];

	std::srand(std::time(NULL));

	for(int i = 0; i < len; i++) {
		v[i] = std::rand() % 5 + 1;
		std::cout << v[i] << ' ';
	}

	std::cout << std::endl;

	for(int i = 0, eq_index; i < len-1; i++)
		if( (eq_index = getEqual(v, len, i)) > 0 )
			std::swap(v[i+1], v[eq_index]);

	for(int i = 0; i < len; i++)
		std::cout << v[i] << ' ';

	std::cout << std::endl;

	std::cin.get();
	return 0;
}
навскидку, но идея должна быть ясна

Последний раз редактировалось netrino; 13.04.2010 в 23:47.
netrino вне форума Ответить с цитированием
Старый 20.04.2010, 19:30   #4
MafoR
Пользователь
 
Регистрация: 25.01.2010
Сообщений: 11
По умолчанию

Спасибо большое.
MafoR вне форума Ответить с цитированием
Старый 20.04.2010, 20:28   #5
MafoR
Пользователь
 
Регистрация: 25.01.2010
Сообщений: 11
По умолчанию

Хм... иногда все равно получается, что три одинаковых символа находятся в середине, а не в начале.
MafoR вне форума Ответить с цитированием
Старый 20.04.2010, 20:36   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А нужно их по кол-ву одинаковых по убыванию сортировать? ) Следовало написать об этом в задании, Вы не находите? ) Программа, которую я написал, группирует вместе все одинаковые числа, в место, где это число встретилось впервые
netrino вне форума Ответить с цитированием
Старый 20.04.2010, 22:50   #7
MafoR
Пользователь
 
Регистрация: 25.01.2010
Сообщений: 11
По умолчанию

Я привел примеры, по которым все вроде очевидно =) Но раз это не так, прошу прошения, что так корява, сформулировал задание =)
Правильная формулировка:
Нужно отсортировать массив по количеству одинаковых цифр, по убыванию.
=)
MafoR вне форума Ответить с цитированием
Старый 20.04.2010, 23:15   #8
silent_1991
Пользователь
 
Регистрация: 06.11.2009
Сообщений: 68
По умолчанию

Я бы делал так. Заводим массив из 6 элементов, скажем, int index[6]. Пробегаем по нашему входному массиву mas, для каждого встреченного элемента увеличиваем значение элемента массива index, для которого служит индексом наш элемент из mas. А затем просто выводим каждое i-е число index[i] раз (соответственно выводим сначала максимальное, затем сбрасываем значение, например, на -1, следующее максимальное и т.д.).

Если надо, код на чистом Си:
Код:
#include <stdio.h>

int max_index(int *mas, int n)
{
    int i;
    int max;
    
    max = 0;
    
    for (i = 0; i < n; i++)
    {
        if (mas[i] > mas[max])
        {
            max = i;
        }
    }
    
    return max;
}

int main()
{
    int mas[5];
    int index[6] = {0, 0, 0, 0, 0, 0};
    int nozero = 0;
    int i, j;
    
    printf("Vvedite elementi massiva (chislo ot 1 do 6):\n");
    
    for (i = 0; i < 5; i++)
    {
        printf("mas[%d] = ", i);
        scanf("%d", &mas[i]);
        
        if ((mas[i] <= 0) || (mas[i] >= 7))
        {
            printf("Znachenie elementov massiva dolzhno bit' v predelah ot 1 do 6!\nPovtorite vvod!\n");
            i--;
        }
    }
    
    for (i = 0; i < 5; i++)
    {
        index[mas[i] - 1]++;
    }
    
    for (i = 0; i < 6; i++)
    {
        if (index[i] != 0)
        {
            nozero++;
        }
    }
    
    for (i = 0; i < nozero; i++)
    {
        for (j = 0; j < index[max_index(index, 6)]; j++)
        {
            printf("%d ", max_index(index, 6) + 1);
        }
        
        index[max_index(index, 6)] = 0;
    }
    
    getch();
    return 0;
}

Последний раз редактировалось silent_1991; 21.04.2010 в 00:42.
silent_1991 вне форума Ответить с цитированием
Старый 24.04.2010, 17:41   #9
MafoR
Пользователь
 
Регистрация: 25.01.2010
Сообщений: 11
По умолчанию

Спасибо большое, щас попробую.
MafoR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка массива ttjke Помощь студентам 0 01.12.2009 20:03
Нестандартная сортировка DJOV Microsoft Office Excel 5 10.09.2009 01:17
Сортировка массива Cpluser Общие вопросы C/C++ 4 04.03.2009 23:57
Сортировка массива С/С++ Dagget Помощь студентам 1 16.07.2008 12:18
Сортировка массива Dagmaria Общие вопросы C/C++ 5 05.07.2008 00:23