|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Пара вопросов по Блочной сортировке |
|
C/C++ - [решено] Пара вопросов по Блочной сортировке
|
Будем жить, Маэстро... Сообщения: 6694 |
Профиль | Сайт | Отправить PM | Цитировать Товарищи! Тут по заданию решил задачу "Блочная сортировка", вроде решил, но такой вопрос, мне кажется, что я не так её решил, как нужно. Не могли бы вы подсказать, насколько я неправильно решил, хотя код рабочий, но можно как-то улучшить конструкцию, например:
1. Хочу, чтобы массив перебирался и вычислялось число у которого чисел в разрядах наибольшее количество, пример: "7" = 1 разряд в числе, "243" - 3 раряда в числе, "23888" - 5 разрядов, "24" - 2 разряда, и т.д. Это нужно для вычисления проходов в цикле for, Чтобы в первом цикле for можно было подставлять вычисленное число, а не вручную, как сейчас "5", мне кажется нужна функция: которая принимает число и переводит его в строку, но я не знаю эту функцию, подскажете?! 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]; } //------------------------------------------------------------------------- |
|
------- Отправлено: 19:33, 03-01-2008 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Доброго здоровья и с прошедшим Рождеством!
Цитата pva:
Цитата pva:
Цитата pva:
1. Вы создаёте массив целых чисел и приводите его к типу vector, а потом создаём массив указателей TempArray на целое число, для того, чтобы хранились не числа, а адреса, так будет "дешевле" для памяти... Поправьте, или дополните мои пробелы в объяснении. И вот эту строку. 2. Здесь, я немного не понял, &, операция адресации, возвращает адрес своего правого операнда, а потому, думаю, что присваивает адрес массиву указателей! [Position * n] - это расположение элементов соответствено чему?! К примеру, Position = 20000;, а n = 2;, то при умножении, будет TempArray[2] = &mem_TempArray[40000];, тоесть, третьему элементу массива TempArray, присвоится значение... я тут запутался... Объясните пожалуйста... Кстати, с Вашей модификацией, действительно всё работает на Ура!!! |
|||
------- Отправлено: 23:41, 08-01-2008 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 1180
|
Профиль | Отправить 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> есть операторы: они возвращают ссылку на элемент по номеру 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 |
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата pva:
|
|
------- Отправлено: 19:28, 09-01-2008 | #13 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
[решено] Пара вопросов по видеокартам в плане железа и 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 |
|