Пара вопросов по Блочной сортировке
Товарищи! Тут по заданию решил задачу "Блочная сортировка", вроде решил, но такой вопрос, мне кажется, что я не так её решил, как нужно. Не могли бы вы подсказать, насколько я неправильно решил, хотя код рабочий, но можно как-то улучшить конструкцию, например:
1. Хочу, чтобы массив перебирался и вычислялось число у которого чисел в разрядах наибольшее количество, пример: "7" = 1 разряд в числе, "243" - 3 раряда в числе, "23888" - 5 разрядов, "24" - 2 разряда, и т.д. Это нужно для вычисления проходов в цикле for, Чтобы в первом цикле for можно было подставлять вычисленное число, а не вручную, как сейчас "5", мне кажется нужна функция: которая принимает число и переводит его в строку, но я не знаю эту функцию, подскажете?! Код:
len = strlen(функция ЧислоВСтроку(ar[j])); Прочитал тему на форуме Последовательность чисел Подумал, а нельзя ли как-нибудь использовать исключающее "И" или "или"?! Для сортировки. Как решено в этой теме 5pliT-ом, если можно то как?! В общем раскритикуйте мой код или укажате на слабые места, если можно с поправкой. Буду благодарен! Код:
// Блочная сортировка--------------------------------------------------------------------------- |
Цитата:
char * itoa ( int value, char * str, int base ); обычно её можно найти в stdlib.h. Или можно написать самому примерно так: Код:
char* itoa(int val, int base) { Код:
int rzr(int nn) { Цитата:
Цитата:
|
|
Drongo, отсортируйте массив: 123, 456, 7890 Мне кажется в этом месте:
Код:
ar[counter++] = TempArray[a][b]; |
pva, Спасибо за ответ и помощь, но
Цитата:
Код:
TempArray[Ras][j] = ar[j]; // Расположение соответсвенно разряду ---------------------------------------------------------------------- Привет 5pliT, тут кажись ошибка Цитата:
Код:
while(n < 0 || n > 0) Код:
while(n < 0 && n > 0) Цитата:
Код:
int main() Код:
void bucketSort(int ar[], const int sz) |
Цитата:
Где у вас ошибка я не знаю, это отлавливать надо. Но думаю, что или в этой строчке: TempArray[Ras][j] = ar[j]; или в этой: ar[counter++] = TempArray[a][b]; |
Цитата:
Буду разбираться... |
Drongo, с алгоритмом похоже всё в порядке. Интересно, на каком компиляторе вы собирали и отлаживали? у меня сразу при входе в bucketSort вышла ошибка stack overflow. Варианта решения 2: сказать компилятору увеличить стек или использовать динамическую память. Вот в таком виде всё заработало:
Код:
void bucketSort(int ar[], const int sz) |
Цитата:
Цитата:
Цитата:
Цитата:
|
Начиная ещё с первых компьютеров разработали хитрую систему для передачи данных между блоками программы и для выделения памяти под собственные нужды блоков. ПРичём надо было сделать так, чтобы
Код:
// каждый вызов func1 должен иметь собственную память для x Код:
// древний компьютер (карта памяти в килобайтах): template<typename T> class vector {...} - это шаблон C++ контейнера с упорядоченным расположением элементов в свободной памяти. Контейнер - не в том смысле, в каком употребляется в гуишных библиотеках, а для хранения одинаковых структур в памяти. В угловых скобках пишется класс, для которого (основные ограничения): 1. есть явный конструктор по умолчанию explicit T() и конструктор копирования T(const T&) 2. нет побочных эффектов при копировании 3. нет чистых вируальных функций при раскрытии шаблона создаётся новый класс, который имеет такое хитрое имя vector<T>. можно сделать через оператор new: Код:
int* mem_TempArray = new int[Position*Rasryad]; |
Доброго здоровья и с прошедшим Рождеством!
Цитата:
Цитата:
Цитата:
1. Код:
vector<int> mem_TempArray(Position * Rasryad); И вот эту строку. 2. Код:
for(unsigned n = 0; n < Rasryad; ++n) TempArray[n] = &mem_TempArray[Position * n]; Кстати, с Вашей модификацией, действительно всё работает на Ура!!! |
по пунктам:
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; таким образом, если у нас 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 в памяти поместятся легко (только в глубокий свап уйдут) |
Цитата:
|
Время: 22:14. |
Время: 22:14.
© OSzone.net 2001-