Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Пара вопросов по Блочной сортировке

Ответить
Настройки темы
C/C++ - [решено] Пара вопросов по Блочной сортировке

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


Товарищи! Тут по заданию решил задачу "Блочная сортировка", вроде решил, но такой вопрос, мне кажется, что я не так её решил, как нужно. Не могли бы вы подсказать, насколько я неправильно решил, хотя код рабочий, но можно как-то улучшить конструкцию, например:
1. Хочу, чтобы массив перебирался и вычислялось число у которого чисел в разрядах наибольшее количество, пример: "7" = 1 разряд в числе, "243" - 3 раряда в числе, "23888" - 5 разрядов, "24" - 2 разряда, и т.д. Это нужно для вычисления проходов в цикле for, Чтобы в первом цикле for можно было подставлять вычисленное число, а не вручную, как сейчас "5", мне кажется нужна функция: которая принимает число и переводит его в строку, но я не знаю эту функцию, подскажете?!
Код: Выделить весь код
len = strlen(функция ЧислоВСтроку(ar[j]));
2. И ещё почему при размере массива в 20000 функция работает, а с размером уже больше 20 тысяч вылетает в ошибку?! Проверял только до 100000 и выставлял, число в разрядах "6". Что не так?!
Прочитал тему на форуме Последовательность чисел Подумал, а нельзя ли как-нибудь использовать исключающее "И" или "или"?! Для сортировки. Как решено в этой теме 5pliT-ом, если можно то как?!
В общем раскритикуйте мой код или укажате на слабые места, если можно с поправкой. Буду благодарен!
Код: Выделить весь код
// Блочная сортировка---------------------------------------------------------------------------
#include <iostream.h>
using std::cout;
using std::cin;
using std::endl;

#include <iomanip.h>
using std::setw;

#include <cstring>

#include <stdlib.h>
#include <ctime.h>
using std::time;

void bucketSort(int ara[], const int sze);

int main()
{
   const int size = 20000;
   int array[size] = {0};
   int z = 1;

   srand(time(0));

   cout<<" Inizialization array..."<<endl;
   for(int i = 0; i < size; i++)
      array[i] = rand() % size; // Генерация случайных чисел для заполнения массива первоначальными значениями

   for(int j = 0; j < size; j++)
      cout<<setw(8)<<array[j]; // Вывод НЕСОРТИРОВАННОГО массива

   cout<<"----------------------------------------------------------------------"<<endl<<endl<<endl;

   bucketSort(array, size); // Функция сортировки

   cin>>z;
   
   return 0;
}
//---------------------------------------------------------------------------
void bucketSort(int ar[], const int sz)
{
   const int Rasryad = 10;
   const int Position = 20000;
   int TempArray[Rasryad][Position] = {0};
   int /*lenght = 0,*/ temp, number = 1, Ras, counter = 0;;

//   for(int j = 0; j < sz; j++){
  //     temp = strlen((ar[j]));
    //   if(lenght < temp)
      //    lenght = temp;
     //}

   // Распределяющий проход
   for(int i = 0; i < 5; i++){ // Проход столько, сколько разряда у числа
       for(int j = 0; j < sz; j++){ // Проход столько, сколько чисел в массиве
           Ras = ar[j] / number % 10; // Вычисление позиции разряда
           TempArray[Ras][j] = ar[j]; // Расположение соответсвенно разряду
         }
       // Собирающий проход после каждого распределяющего
	   counter = 0;
       for(int a = 0; a < Rasryad; a++){
           for(int b = 0; b < Position; b++){
               if(TempArray[a][b] != 0){
                  ar[counter++] = TempArray[a][b];
                  TempArray[a][b] = 0;
                 }
             }
         }
       number *= 10;
     }

    for(int i = 0; i < sz; i++) // Вывод сортированного массива
      cout<<setw(8)<<ar[i];
}
//-------------------------------------------------------------------------

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 19:33, 03-01-2008

 

Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Доброго здоровья и с прошедшим Рождеством!
Цитата pva:
"стек". Он и действует по принципу "последний зашёл, первый вышел". »
Да, спасибо большое, я сегодня читал, по классу vector есть ещё list и deque, прочитал, что vector и deque, более "близки" по принципу, добавляют данные только в начало или в конец, а list, может добавлять в середину списка
Цитата pva:
template<typename T> »
шаблоны изучал, но не глубинно, ещё знаю, что есть стеки, очереди, деревья, списки, также, что принцип - "первый вошёл - первый вышел", "первый вошёл - последний вышел", но это я ещё буду основательно изучать в скором времени, но коль столкнулся уже сейчас, то почему бы паралельно не захватить багаж знаний касательно сих вещей, Вам,pva, с глубоким уважением жму руку, за терпение к моим вопросам! А так же 5pliT'у! Ошибку компилятор выдавал ту что Вы говорили,
Цитата pva:
stack overflow »
, мне казалось, что при размере большем, чем 20000, массив правильно не выделяется, и элементам не "удаётся правильно" расположиться последовательно, поэтому происходит такая ошибка... pva, Вы могли бы мне объяснить эти строки или поправить меня?! Я сейчас напишу, как я их понял.
1.
Код: Выделить весь код
vector<int> mem_TempArray(Position * Rasryad);
 int* TempArray[Rasryad];
Вы создаёте массив целых чисел и приводите его к типу vector, а потом создаём массив указателей TempArray на целое число, для того, чтобы хранились не числа, а адреса, так будет "дешевле" для памяти... Поправьте, или дополните мои пробелы в объяснении.
И вот эту строку.
2.
Код: Выделить весь код
for(unsigned n = 0; n < Rasryad; ++n) TempArray[n] = &mem_TempArray[Position * n];
Здесь, я немного не понял, &, операция адресации, возвращает адрес своего правого операнда, а потому, думаю, что присваивает адрес массиву указателей! [Position * n] - это расположение элементов соответствено чему?! К примеру, Position = 20000;, а n = 2;, то при умножении, будет TempArray[2] = &mem_TempArray[40000];, тоесть, третьему элементу массива TempArray, присвоится значение... я тут запутался... Объясните пожалуйста...
Кстати, с Вашей модификацией, действительно всё работает на Ура!!!

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 23:41, 08-01-2008 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

pva pva вне форума

Аватара для pva

Ветеран


Сообщения: 1180
Благодарности: 279

Профиль | Отправить PM | Цитировать


по пунктам:
1. по правилам C++ vector<int> mem_TempArray(Position * Rasryad); читается как объявление переменной типа vector<int> (это как раз хитрое имя типа) с именем mem_TempArray и использованием конструктора
vector<int>::vector<int>(unsigned size, const int& init = int());
второй массив позволяет не переписывать ваш код (на самом деле есть много способов эффективно обойтись без него).
В нашем случае каждому элементу TempArray присваивается адрес каждого последовательного блока размером Position. То есть адрес начала каждой строчки.

2. В C++ можно переопределять почти все операторы. У vector<T> есть операторы:
Код: Выделить весь код
const T& vector<T>::operator[](unsigned pos) const;
T& vector<T>::operator[](unsigned pos);
они возвращают ссылку на элемент по номеру pos. Адрес ссылки - это адрес памяти этого элемента.
таким образом, если у нас vector<int>, Position=10000, то каждому n-ному элементу TempArray присваивается адрес _data + n*10000*sizeof(int), где _data - это адрес куска, который занял вектор.

на всякий случай напомню, что для 32-разрядной ОС windows виртуальная память линейная, размером до 4Gb и считается, что типы данных имеют значения (гробо):
short -32K..+32K
long -2G..+2G
int -2G..+2G
unsigned short 0K..+64K
unsigned long 0K..+4G
unsigned int 0K..+4G
то есть теоретически в вектор может поместиться (4G - _data)/sizeof(T) значений. Думаю 100 миллионов int в памяти поместятся легко (только в глубокий свап уйдут)
Это сообщение посчитали полезным следующие участники:

Отправлено: 19:06, 09-01-2008 | #12


Аватара для Drongo

Будем жить, Маэстро...


Сообщения: 6694
Благодарности: 1393

Профиль | Сайт | Отправить PM | Цитировать


Цитата pva:
В нашем случае каждому элементу TempArray присваивается адрес каждого последовательного блока размером Position. То есть адрес начала каждой строчки. »
И мы имеем не один громадный массив, а несколько малых по сравнению с двухмерным, вернее адресов на них! Спасибо большое!!!

-------
Правильная постановка вопроса свидетельствует о некотором знакомстве с делом.
3нание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нём сведения.
[Quick Killer 3.0 Final [OSZone.net]] | [Quick Killer 3.0 Final [SafeZone.cc]] | [Парсер логов Gmer] | [Парсер логов AVZ]

http://tools.oszone.net/Drongo/Userbar/SafeZone_cc.gif


Отправлено: 19:28, 09-01-2008 | #13



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Пара вопросов по Блочной сортировке

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Пара вопросов по видеокартам в плане железа и OEM Windows... Gold Dragon Хочу все знать 22 09-01-2010 19:10
[решено] Gigabyte GA-MA78LM-S2 пара вопросов по камню и памяти. QuartZz Материнские платы и память 2 04-11-2009 00:04
[решено] Пара вопросов про GPO и SRP. PoliceMan Microsoft Windows NT/2000/2003 1 29-10-2009 14:00
[решено] Пара вопросов о сети :) Hattori_Hanzo Хочу все знать 4 01-06-2009 14:04
[решено] пара вопросов о замедлении видеокарты. 12341234 Разгон, охлаждение и моддинг 5 09-07-2008 20:38




 
Переход