Otros algoritmos de ordenacin 1 Mtodo de ordenacin

  • Slides: 9
Download presentation
Otros algoritmos de ordenación 1

Otros algoritmos de ordenación 1

Método de ordenación por inserción Se divide la tabla en dos subtablas: - la

Método de ordenación por inserción Se divide la tabla en dos subtablas: - la subtabla de la izquierda está ordenada e inicialmente contiene un solo elemento; - la subtabla derecha está desordenada. En cada iteración se escoge el primer elemento de la subtabla derecha y se coloca en la posición que le corresponde en la subtabla izquierda. Para ello se desplazan una posición adelante todos los elementos de la subtabla izquierda que son mayores que dicho elemento y finalmente se inserta en su posición. [4, 3, 7, 5, 1] elemento = 3 [4, , 7, 5, 1], [ , 4, 7, 5, 1], [3, 4, 7, 5, 1] elemento = 7 [3, 4, , 5, 1], [3, 4, 7, 5, 1] elemento = 5 [3, 4, 7, , 1], [3, 4, , 7, 1], [3, 4, 5, 7, 1] elemento = 1 [3, 4, 5, 7, ], [3, 4, 5, , 7], [3, 4, , 5, 7] [3, , 4, 5, 7], [ , 3, 4, 5, 7], [1, 3, 4, 5, 7] 2

void ordena_insercion(double v[N]){ int i, j; double el; for (i=1; i<N; i++) { el=v[i];

void ordena_insercion(double v[N]){ int i, j; double el; for (i=1; i<N; i++) { el=v[i]; j=i-1; while (v[j]>el && j>=0) { v[j+1]=v[j]; j--; } v[j+1]=el; } } 3

Método de ordenación rápida Se extrae el primer elemento de la tabla y se

Método de ordenación rápida Se extrae el primer elemento de la tabla y se divide ésta en dos subtablas tales que: - los elementos de la subtabla de la izquierda sean menores o iguales que el elemento extraído; - los elementos de la subtabla derecha sean mayores o iguales que el elemento extraído. Se ordena cada una de las subtablas utilizando el mismo método, y se construye la tabla ordenada completa colocando el elemento extraído después del último elemento de la subtabla de la izquierda y antes del primer elemento de la subtabla derecha. S. Izquierda [4, 3, 7, 5, 1] elemento = 4 [1, 3], k=3 [1, 3] elemento = 1 [], k=1 [5, 7] elemento = 5 [], k=3 S. Derecha [5, 7], T. Ordenada [IO , 4, DO] [3] [1, 3] = IO [7] [5, 7] = DO [1, 3, 4, 5, 7] 4

void ordena_rapida(double v[N]){ ordena_rapida(v, 0, N-1); } void ordena_rapida(double v[N], int i, int j){

void ordena_rapida(double v[N]){ ordena_rapida(v, 0, N-1); } void ordena_rapida(double v[N], int i, int j){ int k; if (i < j) { divide(v, i, j, k); ordena_rapida(v, i, k-1); ordena_rapida(v, k+1, j); } } 5

void divide(double v[N], int i, int j, int& k) { double el=v[i]; int k=i,

void divide(double v[N], int i, int j, int& k) { double el=v[i]; int k=i, q=j; while (k < q) { if (v[q] < el) { intercambia(v[k+1], v[q]); k++; } else { q--; } } intercambia(v[i], v[k]); } 6

Ordenación por fusión La ordenación por fusión se basa en la idea de dividir

Ordenación por fusión La ordenación por fusión se basa en la idea de dividir la tabla en dos partes que se ordenan por separado, y a continuación fusionar las dos partes ya ordenadas. Ejemplo [6, 1, 8, 5, 9, 7, 4, 6, 7, 2, 6] Se divide la tabla en dos partes [6, 1, 8, 5, 9] [7, 4, 6, 7, 2, 6] Se ordenan por separado las dos partes [1, 5, 6, 8, 9] [2, 4, 6, 6, 7, 7] Se fusionan las dos partes ordenadas [1, 2, 4, 5, 6, 6, 6, 7, 7, 8, 9] 7

void ordena_fusion(double v[N], int p, int u){ int k; if (p<u) { k=(p+u)/2; ordena_fusion(v,

void ordena_fusion(double v[N], int p, int u){ int k; if (p<u) { k=(p+u)/2; ordena_fusion(v, p, k); ordena_fusion(v, k+1, u); fusion_local(v, p, k, u); } } 8

void fusion_local(double v[N], int i, int k, int j) { double x[N]; int p=i,

void fusion_local(double v[N], int i, int k, int j) { double x[N]; int p=i, q=k+1, r=i; while (p<=k && q<=j) { if (v[p]>v[q]) { x[r]=v[q]; q++; } else { x[r]=v[p]; p++; } r++; } while (p<=k) {x[r]=v[p]; p++; r++; } while (q<=j) {x[r]=v[q]; q++; r++; } p=i; while (p<=j) {v[p]=x[p]; p++; } } 9