Задача:
Дано:
массив.
Требуется: отсортировать этот массив по по возрастанию по пузырьковому алгоритму.
Решение:
template <TBase> class TArray // Шаблон класса
{
protected: // Защищённые члены
TBase *Data; // Здесь будут храниться элменты
uint32_t Start; // Индекс первого элемента
uint32_t Count; // Количество элментов
public:
TArray (); // Дефолтный конструктор
TArray (TArray &Array); // Копирующий конструктор
TArray operator = (TArray &Array); // Оператор присваивания
TBase & operator [] (uint32_t Index); // Оператор индексации
bool ReSize (uint32_t Begin, uint32_t End); // Задаём диапазон индексов
uint32_t Number (); // Читаем число элементов
uint32_t First(); // Читаем индекс первого элемента
uint32_t Last; // Вычисляем индекс последнего элемента
void Sort ();
};
TArray::TArray ()
{
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
}
TArray::TArray (TArray &Array)
{
TBase *p1; // Указатель на элемент
TBase *p2; // Указатель на элемент
if (Array.Count!=0) // Оригинал не пуст?
{// Оригинал не пуст
Data=new TBase [Array.Count]; // Создаём массив
if (Data) // Массив создан?
{// Массив создан
for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
{// Тело цикла
(*p1)=(*p2); // Копируем элемент
}// Тело цикла
}// Массив создан
else
{// Массив не создан
Start=0; // Пустой массив
Count=0; // Пустой массив
}// Массив не создан
}// Оригинал не пуст
else
{// Оригинал пуст
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
}// Оригинал пуст
}
TArray
TArray::operator = (TArray &Array)
{
TBase *p1; // Указатель на элемент
TBase *p2; // Указатель на элемент
if (Array.Count!=0) // Оригинал не пуст?
{// Оригинал не пуст
Data=new TBase [Array.Count]; // Создаём массив
if (Data) // Массив создан?
{// Массив создан
for (p1=Data+Array.Count-1, p2=Array.Data+Array.Count-1, Count=Array.Count; Start=Array.Start; p1>=Data; --p1, --p2) // Цикл: p1=указатель на последний элемент копии, p2=указатель на последний элемент оригинала, копируем число элементов, копируем индекс первого элемента и, пока p1 в копии (а p2 в оригинале) крутим цикл, каждый раз переводя оба указтеля на предыдущие элементы
{// Тело цикла
(*p1)=(*p2); // Копируем элемент
}// Тело цикла
}// Массив создан
else
{// Массив не создан
Start=0; // Пустой массив
Count=0; // Пустой массив
}// Массив не создан
}// Оригинал не пуст
else
{// Оригинал пуст
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
}// Оригинал пуст
return *this; // Возвращаем копию
}
TBase &
TArray:: operator [] (uint32_t Index)
{
return Data[Index-Start]; // На самом деле первый элемент - нулевой, второй - первый и так далее. Значит внутренний индекс любого элемента меньше на индекс первого. Вычисляем его и возвращаем ссылку на элемент
}
bool
TArray::ReSize (uint32_t Begin, uint32_t End)
{
uint32_t Ssize;
if (Data) // Массив уже не пуст?
{// Массив уже не пуст
delete [] Data; // Стираем нафиг все его элементы
}// Массив уже не пуст
if (End>=Begin) // Надо создать массив?
{// Надо создать массив
Size=End-Begin+1; // Вычисляем размер массива
if (Size>0)// Размер массива не переполнен?
{// Размер массива не переполнен
Data=new TBase [Size]; // Создаём массив
if (Data)// Массив создан?
{// Массив созда
Start=Begin; // Ставим индекс первого элемента
Count=Size-1; // Ставим число элементов
}// Массив создан
}// Размер массива не переполнен
else
{// Размер массива переполнен
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
return false; // Возвращаем флаг ошибки
}// Размер массива переполнен
}// Надо создать массив
else
{//Массив создавать не надо, так как он должен быть пуст
Data=NULL; // Пустой массив
Start=0; // Пустой массив
Count=0; // Пустой массив
}//Массив создавать не надо, так как он должен быть пуст
return true; // Возвращаем флаг того, что размер массива успешно изменён
}
uint32_t
TArray::uint32t Number ()
{
return Count;
}
uint32_t
TArray::First()
{
return Start;
}
uint32_t
TArray::Last
{
if (Count>0)// Массив существует?
{// Массив существует
return Start+Count-1; // Возвращаем индекс последнего элемента: внутренний индекс последнего элемента всегда на 1 меньше числа элементов, но внутренний индекс первого элемента - 0, значит внешние индексы всех элементов на внешний индекс первого больше
}// Массив существует
return 0; // Массива нет и возвращаем 0
}
void
TArray::Sort ()
{
TBase *temp;
TBase *p1;
TBase *p2;
if (Count>1)// Есть что вообще сортировать?
{// Есть что вообще сортировать
for (p1=Data+Count-2; p1>Data; --p1) // Цикл перебора следующего элемента массива
{// Тело цикла перебора следующего элемента массива
for (p2=p1-1; p2>=Data; --p2) // Цикл перебора предыдущего элемента массива
{// Тело цикла перебора предыдущего элемента массива
if ((*p2)>(*p1))// Предыдущий элемент больше следующего?
{// Предыдущий элемент больше следующего. Меняем их местами
(*temp)=(*p1);
(*p1)=(*p2);
(*p2)=(*temp);
}// Предыдущий элемент больше следующего. Меняем их местами
}// Тело цикла перебора предыдущего элемента массива
}// Тело цикла перебора следующего элемента массива
}// Есть что вообще сортировать
}