|
Внимание, важное сообщение: Дорогие Друзья!
В ноябре далекого 2001 года мы решили создать сайт и форум, которые смогут помочь как начинающим, так и продвинутым пользователям разобраться в операционных системах. В 2004-2006г наш проект был одним из самых крупных ИТ ресурсов в рунете, на пике нас посещало более 300 000 человек в день! Наша документация по службам Windows и автоматической установке помогла огромному количеству пользователей и сисадминов. Мы с уверенностью можем сказать, что внесли большой вклад в развитие ИТ сообщества рунета. Но... время меняются, приоритеты тоже. И, к сожалению, пришло время сказать До встречи! После долгих дискуссий было принято решение закрыть наш проект. 1 августа форум переводится в режим Только чтение, а в начале сентября мы переведем рубильник в положение Выключен Огромное спасибо за эти 24 года, это было незабываемое приключение. Сказать спасибо и поделиться своей историей можно в данной теме. С уважением, ваш призрачный админ, BigMac... |
|
| Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] Пара вопросов по Блочной сортировке |
|
||||
|
|
C/C++ - [решено] Пара вопросов по Блочной сортировке
|
|
Будем жить, Маэстро... Сообщения: 6694 |
Товарищи! Тут по заданию решил задачу "Блочная сортировка", вроде решил, но такой вопрос, мне кажется, что я не так её решил, как нужно. Не могли бы вы подсказать, насколько я неправильно решил, хотя код рабочий, но можно как-то улучшить конструкцию, например:
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 |
|
Новый участник Сообщения: 21
|
Профиль | Отправить PM | Цитировать Цитата Drongo:
char * itoa ( int value, char * str, int base ); обычно её можно найти в stdlib.h. Или можно написать самому примерно так: char* itoa(int val, int base) {
char buf[32] = {0};
int i=30;
for(;val&&i;--i,val/=base)
buf[i]="0123456789abcdef"[val%base];
return &buf[i+1];
}
Цитата Drongo:
Цитата Drongo:
|
|||
|
Отправлено: 21:19, 04-01-2008 | #2 |
|
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать |
|
------- Отправлено: 21:26, 04-01-2008 | #3 |
|
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать |
|
Отправлено: 22:11, 04-01-2008 | #4 |
|
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать pva, Спасибо за ответ и помощь, но
Цитата pva:
Почему?! Незнаю, иной раз сортирует 14 элементов, иной раз 2, иной раз 7, почему так, хоть убейте, не знаю?! ---------------------------------------------------------------------- Привет 5pliT, тут кажись ошибка Цитата 5pliT:
или А по поводу Цитата 5pliT:
и тут: Разряды не трогаем, поскольку в 50000 и в 20000 по 5 разрядов в числе, попробуй пожалуйста, посмотри что за ошибка?! Проблема явно не в типе переменной, стопроцентно! |
||||
|
------- Последний раз редактировалось Drongo, 05-01-2008 в 20:18. Причина: Добавлены поправки и комментарии... Отправлено: 19:31, 05-01-2008 | #5 |
|
Новый участник Сообщения: 21
|
Профиль | Отправить PM | Цитировать Цитата Drongo:
<> - это знак "не равно" в паскале. А в си это так: !=Где у вас ошибка я не знаю, это отлавливать надо. Но думаю, что или в этой строчке: TempArray[Ras][j] = ar[j]; или в этой: ar[counter++] = TempArray[a][b]; |
|
|
Отправлено: 12:02, 06-01-2008 | #6 |
|
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата 5pliT:
Буду разбираться... |
|
|
------- Отправлено: 21:19, 06-01-2008 | #7 |
|
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Drongo, с алгоритмом похоже всё в порядке. Интересно, на каком компиляторе вы собирали и отлаживали? у меня сразу при входе в bucketSort вышла ошибка stack overflow. Варианта решения 2: сказать компилятору увеличить стек или использовать динамическую память. Вот в таком виде всё заработало:
void bucketSort(int ar[], const int sz)
{
const int Rasryad = 10;
const int Position = 100000;
vector<int> mem_TempArray(Position*Rasryad);
int* TempArray[Rasryad];
for(unsigned n=0; n<Rasryad; ++n) TempArray[n] = &mem_TempArray[Position*n];
int /*lenght = 0, temp,*/ number = 1, Ras, counter = 0;;
// Распределяющий проход
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];
}
//-------------------------------------------------------------------------
|
|
Отправлено: 13:32, 07-01-2008 | #8 |
|
Будем жить, Маэстро... Сообщения: 6694
|
Профиль | Сайт | Отправить PM | Цитировать Цитата pva:
Цитата pva:
Цитата pva:
Цитата pva:
|
||||
|
------- Отправлено: 20:09, 07-01-2008 | #9 |
|
Ветеран Сообщения: 1180
|
Профиль | Отправить PM | Цитировать Начиная ещё с первых компьютеров разработали хитрую систему для передачи данных между блоками программы и для выделения памяти под собственные нужды блоков. ПРичём надо было сделать так, чтобы
// каждый вызов func1 должен иметь собственную память для x
void func1(int z)
{
int x = z;
...
if (0<x) func1(x-1);
}
// древний компьютер (карта памяти в килобайтах): // R - ПЗУ, P - код программы, S - стек (задом-наперёд), пробелы - свободная память // 00k RRRRRRRR 16k PPP SSS 32k // свободная память постоянно уменьшается с ростом стека template<typename T> class vector {...} - это шаблон C++ контейнера с упорядоченным расположением элементов в свободной памяти. Контейнер - не в том смысле, в каком употребляется в гуишных библиотеках, а для хранения одинаковых структур в памяти. В угловых скобках пишется класс, для которого (основные ограничения): 1. есть явный конструктор по умолчанию explicit T() и конструктор копирования T(const T&) 2. нет побочных эффектов при копировании 3. нет чистых вируальных функций при раскрытии шаблона создаётся новый класс, который имеет такое хитрое имя vector<T>. можно сделать через оператор new: но в случае исключения память освобождена не будет (а вектор всегда освобождает за собой память) |
|
Отправлено: 16:50, 08-01-2008 | #10 |
|
|
|
Участник сейчас на форуме |
|
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
| Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
| [решено] Пара вопросов по видеокартам в плане железа и 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 | |
|