00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #define INCLUDE_iostream
00012 #include "ADH_port.h"
00013
00014 #include <cstdlib>
00015 #include <ctime>
00016
00017
00018
00019 class Contenedor_Ordenable {
00020 protected:
00021
00022 int m_cantidad_de_elementos;
00023
00024 public:
00025 typedef int value_type;
00026
00027 Contenedor_Ordenable(unsigned N);
00028 virtual ~Contenedor_Ordenable();
00029
00030
00031
00032 virtual void Intercambie(int i, int j) = 0;
00033
00034
00035
00036
00037
00038 virtual bool Es_Menor(int, int) const = 0;
00039
00040
00041 virtual value_type& operator[](int) = 0;
00042
00043
00044 unsigned Dimension() const { return m_cantidad_de_elementos; }
00045
00046
00047
00048 virtual void ImprimaSe() const = 0;
00049
00050
00051 virtual const char* Nombre() const = 0;
00052 };
00053
00054
00055
00056
00057
00058 class Lista_Ordenable : public Contenedor_Ordenable {
00059
00060 private:
00061
00062 class Nodo {
00063 public:
00064
00065 Nodo(value_type v);
00066 ~Nodo();
00067
00068 Nodo * next;
00069 value_type m_val;
00070 };
00071
00072
00073 void Agregar_Valor(value_type v);
00074
00075 public:
00076
00077 Lista_Ordenable(unsigned N);
00078 virtual ~Lista_Ordenable();
00079
00080 virtual void Intercambie(int, int);
00081 virtual bool Es_Menor(int, int) const;
00082 virtual value_type& operator[](int);
00083
00084 virtual void ImprimaSe() const;
00085 virtual const char* Nombre() const;
00086 private:
00087 Nodo * m_cabeza;
00088 };
00089
00090
00091
00092
00093
00094 class Vector_Ordenable : public Contenedor_Ordenable {
00095
00096 private:
00097 value_type * m_vec;
00098
00099 public:
00100
00101 Vector_Ordenable(unsigned N);
00102 virtual ~Vector_Ordenable();
00103
00104 virtual void Intercambie(int, int);
00105 virtual bool Es_Menor(int, int) const;
00106 virtual value_type& operator[](int);
00107
00108 virtual void ImprimaSe() const;
00109 virtual const char* Nombre() const;
00110 };
00111
00112
00113
00114
00115
00116 class Algoritmo_Ordenador {
00117 private:
00118 public:
00119
00120
00121
00122 virtual void Ordene(Contenedor_Ordenable &C) = 0;
00123
00124 Algoritmo_Ordenador();
00125 virtual ~Algoritmo_Ordenador();
00126
00127
00128 virtual const char* Nombre() const = 0;
00129 };
00130
00131
00132
00133
00134
00135 class Ordenador_Burbuja : public Algoritmo_Ordenador {
00136 public:
00137 Ordenador_Burbuja();
00138 virtual ~Ordenador_Burbuja();
00139
00140
00141 virtual void Ordene(Contenedor_Ordenable &);
00142
00143 virtual const char* Nombre() const;
00144 };
00145
00146
00147
00148
00149
00150 class Ordenador_Burbuja_Optimizada : public Algoritmo_Ordenador {
00151 public:
00152 Ordenador_Burbuja_Optimizada();
00153 virtual ~Ordenador_Burbuja_Optimizada();
00154
00155
00156 virtual void Ordene(Contenedor_Ordenable &);
00157
00158 virtual const char* Nombre() const;
00159 };
00160
00161
00162
00163
00164
00165 class Ordenador_Seleccion : public Algoritmo_Ordenador {
00166 public:
00167 Ordenador_Seleccion();
00168 virtual ~Ordenador_Seleccion();
00169
00170 virtual void Ordene(Contenedor_Ordenable &);
00171
00172 virtual const char* Nombre() const;
00173 };
00174 class Ordenador_Insercion : public Algoritmo_Ordenador{
00175 public:
00176 Ordenador_Insercion();
00177 virtual ~Ordenador_Insercion();
00178
00179
00180 virtual void Ordene(Contenedor_Ordenable &);
00181
00182 virtual const char* Nombre() const;
00183 };
00184
00185
00186
00187
00188
00189 class Ordenador_Mezcla : public Algoritmo_Ordenador{
00190 private:
00191 Lista_Ordenable TMP(20);
00192
00193
00194 for (int i=0; i < 20; ++i) {
00195 TMP[i] = 0;
00196 }
00197 public:
00198 Ordenador_Mezcla();
00199 virtual ~Ordenador_Mezcla();
00200
00201
00202 virtual void Ordene(Contenedor_Ordenable &);
00203
00204 void m_sort(Contenedor_Ordenable &, Lista_Ordenable &, int left, int right);
00205
00206 void merge(Contenedor_Ordenable &, Lista_Ordenable &, int left, int mid, int right);
00207
00208 virtual const char* Nombre() const;
00209 };
00210
00211 Lista_Ordenable::Lista_Ordenable(unsigned N) : Contenedor_Ordenable(N) {
00212 m_cabeza = 0;
00213 this->m_cantidad_de_elementos = N;
00214
00215 srand(time(0));
00216 for (unsigned i = 0; i < N; ++i) {
00217 Agregar_Valor( rand() % 100 );
00218 }
00219 }
00220
00221 Lista_Ordenable::~Lista_Ordenable() {
00222 if (m_cabeza != 0) {
00223 delete m_cabeza;
00224 }
00225 }
00226
00227 Lista_Ordenable::Nodo::Nodo(value_type v) {
00228 this->m_val = v;
00229 next = 0;
00230 }
00231
00232 Lista_Ordenable::Nodo::~Nodo() {
00233
00234 if (next != 0) {
00235 delete next;
00236 }
00237 }
00238
00239 void Lista_Ordenable::Agregar_Valor(value_type v) {
00240 if (m_cabeza == 0) {
00241 m_cabeza = new Nodo(v);
00242 }
00243 else {
00244 Nodo * p = new Nodo(v);
00245 p->next = m_cabeza;
00246 m_cabeza = p;
00247 }
00248 }
00249
00250 void Lista_Ordenable::Intercambie(int i, int j) {
00251 Nodo * pI = m_cabeza;
00252 Nodo * pJ = m_cabeza;
00253
00254 int k;
00255 for (k = 0; k < i; ++k) {
00256 pI = pI->next;
00257 }
00258 for (k = 0; k < j; ++k) {
00259 pJ = pJ->next;
00260 }
00261
00262 value_type temp;
00263 temp = pJ->m_val;
00264 pJ->m_val = pI->m_val;
00265 pI->m_val = temp;
00266 }
00267
00268 bool Lista_Ordenable::Es_Menor(int i, int j) const {
00269 Nodo * pI = m_cabeza;
00270 Nodo * pJ = m_cabeza;
00271
00272 int k;
00273 for (k = 0; k < i; ++k) {
00274 pI = pI->next;
00275 }
00276
00277 for (k = 0; k < j; ++k) {
00278 pJ = pJ->next;
00279 }
00280 return (pI->m_val < pJ->m_val);
00281 }
00282
00283 int& Lista_Ordenable::operator[](int i) {
00284 Nodo * pI = m_cabeza;
00285
00286 int k;
00287 for (k = 0; k < i; ++k) {
00288 pI = pI->next;
00289 }
00290 return pI->m_val;
00291 }
00292
00293 void Lista_Ordenable::ImprimaSe() const {
00294 Nodo * p = m_cabeza;
00295 Nodo * end = 0;
00296 cout << "[";
00297 while (p != end) {
00298 cout << p ->m_val;
00299 if (p->next != end) {
00300 cout << " ";
00301 }
00302 p = p->next;
00303 }
00304 cout << "]" << endl;
00305 }
00306
00307 const char* Lista_Ordenable::Nombre() const {
00308 #ifdef __BORLANDC__
00309
00310
00311 #endif // __BORLANDC__
00312 return "Lista_Ordenable";
00313 }
00314 Vector_Ordenable::Vector_Ordenable(unsigned N) : Contenedor_Ordenable(N) {
00315
00316 m_vec = new Contenedor_Ordenable::value_type [ m_cantidad_de_elementos ];
00317 srand( time(0) );
00318
00319 for (int i = 0; i < m_cantidad_de_elementos; ++i) {
00320 m_vec[i] = rand() % 100;
00321 }
00322 }
00323
00324 Vector_Ordenable::~Vector_Ordenable() {
00325 if (m_vec != 0) {
00326 delete [] m_vec;
00327 }
00328 }
00329
00330 void Vector_Ordenable::ImprimaSe() const {
00331 value_type * p = m_vec;
00332 value_type * end = & m_vec[ m_cantidad_de_elementos ];
00333 cout << "[";
00334 while (p != end) {
00335 cout << *p;
00336 if (p+1 != end) {
00337 cout << " ";
00338 }
00339 p++;
00340 }
00341 cout << "]" << endl;
00342 }
00343
00344 bool Vector_Ordenable::Es_Menor(int i, int j) const {
00345 return (m_vec[i] < m_vec[j]);
00346 }
00347
00348 int& Vector_Ordenable::operator[](int i) {
00349 return m_vec[i];
00350 }
00351
00352 void Vector_Ordenable::Intercambie(int i, int j) {
00353 value_type temp;
00354
00355 temp = m_vec[i];
00356 m_vec[i] = m_vec[j];
00357 m_vec[j] = temp;
00358 }
00359
00360 const char* Vector_Ordenable::Nombre() const {
00361 return "Vector_Ordenable";
00362 }
00363
00364 void Ordenador_Burbuja::Ordene(Contenedor_Ordenable & C) {
00365 int i,j;
00366 for (i = C.Dimension(); i > 0; --i) {
00367 for (j = 1; j < i; j++) {
00368 if ( C.Es_Menor(j, j-1) ) {
00369 C.Intercambie(j, j-1);
00370 }
00371 }
00372 }
00373 }
00374 void Ordenador_Insercion :: Ordene (Contenedor_Ordenable & C){
00375
00376
00377 for ( int next = 1; next < C.Dimension(); next++ )
00378 {
00379 int moveItem = next;
00380
00381
00382 while ( ( moveItem > 0 ) && ( C.Es_Menor(moveItem, moveItem-1) ) )
00383 {
00384
00385 C.Intercambie(moveItem, moveItem-1);
00386 moveItem--;
00387 }
00388
00389 }
00390 }
00391 void Ordenador_Mezcla :: Ordene (Contenedor_Ordenable & C){
00392
00393
00394 m_sort(C, TMP, 0, C.Dimension() - 1);
00395 }
00396 void Ordenador_Mezcla :: m_sort(Contenedor_Ordenable & C, Lista_Ordenable & temp, int left, int right)
00397 {
00398
00399 int mid;
00400
00401 if (right > left)
00402 {
00403 mid = (right + left) / 2;
00404 m_sort(C, temp, left, mid);
00405 m_sort(C, temp, mid+1, right);
00406
00407 merge(C, temp, left, mid+1, right);
00408 }
00409 }
00410 void Ordenador_Mezcla :: merge(Contenedor_Ordenable & C, Lista_Ordenable & temp, int left, int mid, int right)
00411 {
00412 int i, left_end, num_elements, tmp_pos;
00413
00414 left_end = mid - 1;
00415 tmp_pos = left;
00416 num_elements = right - left + 1;
00417
00418 while ((left <= left_end) && (mid <= right))
00419 {
00420 if (C[left] <= C[mid])
00421 {
00422 temp[tmp_pos] = C[left];
00423 tmp_pos = tmp_pos + 1;
00424 left = left +1;
00425 }
00426 else
00427 {
00428 temp[tmp_pos] = C[mid];
00429 tmp_pos = tmp_pos + 1;
00430 mid = mid + 1;
00431 }
00432 }
00433
00434 while (left <= left_end)
00435 {
00436 temp[tmp_pos] = C[left];
00437 left = left + 1;
00438 tmp_pos = tmp_pos + 1;
00439 }
00440 while (mid <= right)
00441 {
00442 temp[tmp_pos] = C[mid];
00443 mid = mid + 1;
00444 tmp_pos = tmp_pos + 1;
00445 }
00446
00447 for (i=0; i <= num_elements; i++)
00448 {
00449 C[right] = temp[right];
00450 right = right - 1;
00451 }
00452 }
00453
00454 void Ordenador_Burbuja_Optimizada::Ordene(Contenedor_Ordenable & C) {
00455 bool cambio = true;
00456 for (int i = C.Dimension(); i > 0 && cambio; --i) {
00457 cambio = false;
00458 for (int j = 1; j < i; j++) {
00459 if (C[j] < C[j-1] ) {
00460 C.Intercambie(j, j-1);
00461 cambio = true;
00462 }
00463 }
00464 }
00465 }
00466
00467 void Ordenador_Seleccion::Ordene(Contenedor_Ordenable & C) {
00468 int n = C.Dimension();
00469 for (int i=0; i < n-1; i++) {
00470 int menor = i;
00471
00472 for (int j=i+1; j<n; j++) {
00473 if ( C[j] < C[menor] ) {
00474 menor = j;
00475 }
00476 }
00477 C.Intercambie(i, menor);
00478 }
00479 }
00480
00481 Contenedor_Ordenable::Contenedor_Ordenable(unsigned N)
00482 : m_cantidad_de_elementos(N) {
00483 }
00484
00485 Contenedor_Ordenable::~Contenedor_Ordenable() {
00486
00487 }
00488
00489 Algoritmo_Ordenador::Algoritmo_Ordenador() {
00490
00491 }
00492
00493 Algoritmo_Ordenador::~Algoritmo_Ordenador() {
00494
00495 }
00496
00497 Ordenador_Burbuja::Ordenador_Burbuja() {
00498
00499 }
00500
00501 Ordenador_Burbuja::~Ordenador_Burbuja() {
00502
00503 }
00504
00505 const char* Ordenador_Burbuja::Nombre() const {
00506 return "Ordenador_Burbuja";
00507 }
00508 Ordenador_Insercion::~Ordenador_Insercion() {
00509
00510 }
00511
00512 Ordenador_Insercion::Ordenador_Insercion(){
00513
00514 }
00515
00516 const char* Ordenador_Insercion::Nombre() const {
00517 return "Ordenador_Insercion";
00518 }
00519 Ordenador_Mezcla::~Ordenador_Mezcla() {
00520 for(int i = 0; i< 20; i++)
00521 delete TMP[i];
00522 }
00523
00524 Ordenador_Mezcla::Ordenador_Mezcla(){
00525
00526 }
00527
00528 const char* Ordenador_Mezcla::Nombre() const {
00529 return "Ordenador_Mezcla";
00530 }
00531
00532 Ordenador_Seleccion::Ordenador_Seleccion() {
00533
00534 }
00535
00536 Ordenador_Seleccion::~Ordenador_Seleccion() {
00537
00538 }
00539
00540 const char* Ordenador_Seleccion::Nombre() const {
00541 return "Ordenador_Seleccion";
00542 }
00543
00544 Ordenador_Burbuja_Optimizada::Ordenador_Burbuja_Optimizada() {
00545
00546 }
00547
00548 Ordenador_Burbuja_Optimizada::~Ordenador_Burbuja_Optimizada() {
00549
00550 }
00551
00552 const char* Ordenador_Burbuja_Optimizada::Nombre() const {
00553 return "Ordenador_Burbuja_Optimizada";
00554 }
00555
00556
00557
00558 bool Esta_Ordenado ( const Contenedor_Ordenable &C ) {
00559 unsigned i;
00560 for (i = 0; i < C.Dimension()-1; ++i) {
00561 if ( C.Es_Menor(i+1,i) ) {
00562 return false;
00563 }
00564 }
00565 return true;
00566 }
00567
00568 #include <assert.h>
00569
00570
00571
00572
00573
00574 int main() {
00575 Algoritmo_Ordenador * pOrdenador;
00576 Contenedor_Ordenable * pContenedor;
00577 srand( time(0) );
00578 cout << endl << endl << endl;
00579 for (int i = 0; i < 5; ++i) {
00580 for (int j = 0; j < 2; ++j) {
00581
00582 cout << endl;
00583 cout << "======================";
00584 cout << "======================";
00585 cout << "======================" << endl;
00586
00587
00588 switch ( i ) {
00589 case 0: pOrdenador = new Ordenador_Burbuja(); break;
00590 case 1: pOrdenador = new Ordenador_Burbuja_Optimizada(); break;
00591 case 2: pOrdenador = new Ordenador_Seleccion(); break;
00592 case 3: pOrdenador = new Ordenador_Insercion(); break;
00593 case 4: pOrdenador = new Ordenador_Mezcla(); break;
00594 }
00595
00596
00597 switch ( j ) {
00598 case 0: pContenedor = new Vector_Ordenable( 20 ); break;
00599 case 1: pContenedor = new Lista_Ordenable( 20 ); break;
00600 }
00601
00602 cout << "<<< " << 2*i+j+1 << " >>> => ";
00603 cout << pContenedor->Nombre() << " <===> ";
00604 cout << pOrdenador->Nombre() << endl;
00605
00606 cout << endl << "[Sin orden]: ";
00607 pContenedor->ImprimaSe();
00608
00609 pOrdenador->Ordene( *pContenedor );
00610 cout << endl << "[Ordenados]: ";
00611 pContenedor->ImprimaSe();
00612
00613 if (! Esta_Ordenado( *pContenedor ) ) {
00614 cout << endl;
00615 cout << "ERRROR: El contenedor " << pContenedor->Nombre() << " NO está ordenado" << endl;
00616 assert( "ERRROR: El contenedor NO está ordenado" && false );
00617 }
00618
00619
00620 delete pOrdenador;
00621 delete pContenedor;
00622 }
00623 }
00624 return 0;
00625 }
00626