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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.11.2012, 15:46   #1
Mr_Extraneo
Новичок
Джуниор
 
Регистрация: 17.11.2012
Сообщений: 2
Злость Не получается составить блочную сортировку

4-й день мучаюсь...не знаю, как разрядность получить
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>
 
using namespace std;
 
void bucketSort (int [], int);
 
int main()
{
    const int size = 10;
    int array1[size] = { 0 }; //одномерный массив, который будем сортировать
 
    srand(4);
 
    //заполняем массив
    for (int i = 0; i < size; i++)
    {
        array1[i] = 1 + rand() % 100;
        cout << array1[i] << " ";
    }
 
    cout << endl;
 
    bucketSort (array1, size); // функция, которая будет выполнять блочную сортировку
 
    //вывод отсотированного массива
    for (int i = 0; i < size; i++)
        cout << array1[i] << " " ;
 
    cout << endl;
 
    system("pause");
    return 0;
}
 
void bucketSort (int array1[], int n)
{
    int array2[10][10] = { 0 }; // создаем новый двумерный массив, для того чтобы сортировать по блокам
    int max = 0;
 
    // определяю максимальный элемент
    for (int i = 0; i < n; i++)
        if (array1[i] > max)
            max = array1[i];
 
    int m = 10; //делитель, нужен будет для работы с разрядами
 
    while (m <= max)
    {
        int array3[10] = { 0 }; //в этом массиве я собирался хранить количество элементов одинаковой разрядности, чтобы потом заполнить ими одну строку в двумерном массиве
 
        //дальше неправильно
        for (int i = 0; i < n; i++)
        {
            array2[array1[i] / m][array3[array1[i] / m]] = array1[i];
            ++array3[array1[i] / m];
        }
 
        for (int i = 0; i < n; i++)
            array1[i] = 0;
 
        //копирую значения в одномерный массив
        for (int i = 0; i < 10; i++)
            for (int j = 0; array2[i][j] != 0; j++)
                array1[i] = array2[i][j];
 
        m *= 10;
    }
}
Mr_Extraneo вне форума Ответить с цитированием
Старый 17.11.2012, 18:45   #2
Mr_Extraneo
Новичок
Джуниор
 
Регистрация: 17.11.2012
Сообщений: 2
По умолчанию

Получилось.
Код:
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

void bucketSort (int [], int);

int main()
{
	const int size = 10;
	int array1[size] = { 0 }; //одномерный массив, который будем сортировать

	srand(time(0));

	//заполняем массив
	for (int i = 0; i < size; i++)
	{
		array1[i] = 1 + rand() % 100;
		cout << array1[i] << " ";
	}

	cout << endl;

	bucketSort (array1, size); // функция, которая будет выполнять блочную сортировку

	//вывод отсотированного массива
	for (int i = 0; i < size; i++)
		cout << array1[i] << " " ;

	cout << endl;

	system("pause");
	return 0;
}

void bucketSort (int array1[], int n)
{
	int array2[10][10] = { 0 }; // создаем новый двумерный массив, для того чтобы сортировать по блокам
	int max = 0;

	// определяю максимальный элемент
	for (int i = 0; i < n; i++)
		if (array1[i] > max)
			max = array1[i];

	int m = 10; //делитель, нужен будет для работы с разрядами

	while (m / 10 <= max)
	{
		int array3[10] = { 0 }; //в этом массиве я собирался хранить количество элементов одинаковой разрядности, чтобы потом заполнить ими одну строку в двумерном массиве
		
		//обнуление массива блоков
		for (int i = 0; i < 10; i++)
			for (int j = 0; j < n; j++)
				array2[i][j] = 0;

		for (int i = 0; i < n; i++)
		{
			array2[(array1[i] % m) / (m / 10)][array3[(array1[i] % m) / (m / 10)]] = array1[i]; //вычисляет адрес клетки и присваевает ему соответствующее значение в неотсортированном массиве
			++array3[(array1[i] % m) / (m / 10)]; // если в определенной строчке уже есть число, то нужно увеличить счетчик, чтобы в следующий раз число с такой же разряднстью стало на следующую ячейку
		}

		//обнуление одномерного массива
		for (int i = 0; i < n; i++)
			array1[i] = 0;

		int count = 0;

		//копирую значения в одномерный массив
		for (int i = 0; i < 10; i++)
			for (int j = 0; array2[i][j] != 0; j++)
			{
				array1[count] = array2[i][j];
				count++;
			}

		m *= 10;
	}
}
Mr_Extraneo вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не получается регулярку составить sergeyrulit JavaScript, Ajax 1 12.01.2012 22:04
Не получается составить условие artemavd Общие вопросы Delphi 10 19.12.2011 04:58
Не получается составить навигацию между Window и page Destroy WPF, UWP, WinRT, XAML 0 18.06.2011 17:38
Не получается составить программу. ITxan Помощь студентам 10 23.10.2010 22:02
Помогите переделать файловую сортировку на сортировку динамич. списков Taisja Помощь студентам 2 15.06.2008 16:10