// ********** // ARRAYS.CPP // ********** #include #include #include "arrays.h" //============================================================================= template void Array::Init(const Array &t) { Allocate(t.size); assert(size == t.size); for (int i = 0; i < size; i++) data[i] = t.data[i]; } //============================================================================= template void Array::Allocate(int as) { // if previously allocated, delete old dynamic array if (size) delete[] data; size = as; data = new T[size]; assert(data); } //============================================================================= template Array::~Array() { delete[] data; } //============================================================================= template T &Array::operator[](int i) const { if (i < 0) { cout<<"ERROR in []: "<= size) { cout<<"ERROR in []: "<= "<= 0); assert(i < size); return data[i]; } //============================================================================= template T &Array::Data(int i) { if (i < 0) { cout<<"ERROR in Data: "<= size) { cout<<"ERROR in Data: "<= "<= 0); assert(i < size); return data[i]; } //============================================================================= template Array &Array::operator = (const Array &t) { if (!size) // if the object in not yet allocated, do it and then assign Allocate(t.size); assert(size == t.size); for (int i = 0; i < size; i++) data[i] = t.data[i]; return *this; } //============================================================================= template int Array::Size() const { return size; } //============================================================================= template ostream &operator<<(ostream &s, const Array &t) { for (int i =0; i < t.size; i++) s< void Array::Set(T t) { for (int i =0; i < size; i++) data[i] = t; } //============================================================================= //============================================================================= // HeapSort data[0..size-1] DESCENDING template void SortableArray::Sort() { // build the heap for (int i = Size()-1; i >= 0; i--) Adjust(i, Size()-1); for (int i = Size()-1; i >= 1; i--) { // swap data T temp1 = Data(0); Data(0) = Data(i); Data(i) = temp1; Adjust(0, i-1); } } //============================================================================= template void SortableArray::Adjust(int root, int last) { if (2*root <= last) { int child = 2*root; if ((child+1) <= last) { if (Data(child+1) < Data(child)) child++; } if (Data(child) < Data(root)) { T temp = Data(root); Data(root) = Data(child); Data(child) = temp; Adjust(child, last); } } } //============================================================================= //============================================================================= // HeapSort data[0..size-1] DESCENDING template void CompSortableArray::Sort() { // build the heap int sz = Size(); for (int i = sz-1; i >= 0; i--) { Adjust(i, sz-1); } for (i = sz-1; i >= 1; i--) { // do the swap T temp1 = Data(0); Data(0) = Data(i); Data(i) = temp1; Adjust(0, i-1); } } //============================================================================= template void CompSortableArray::Adjust(int root, int last) { if (2*root <= last) { int child = 2*root; if ((child+1) <= last) { if (comp_ptr->Compare(Data(child+1), Data(child)) == -1) { child++; } } if (comp_ptr->Compare(Data(child), Data(root)) == -1) { T temp = Data(root); Data(root) = Data(child); Data(child) = temp; Adjust(child, last); } } } //=============================================================================