Documentos de Académico
Documentos de Profesional
Documentos de Cultura
GUIA DE APLICACIÓN Nº 01
ENTREGA DE ACTIVIDAD DE LA GUÍA N°4B MÉTODOS DE ORDENAMIENTO Inserción
Selección y Shell
I. DATOS INFORMATIVOS:
1.1. Nombre de la asignatura : Estructura de datos
1.2. Semestre Académico : 2020 - I
1.3. Ciclo de estudios : 4°
1.4. Nombre del docente : Mtra. Ing. Lizet Vargas Vera
1.5. Grupo : A
1.6. Objetivos Educacionales : OEP1
1.7. Resultados del Estudiante : RE(a)= 1
1.8. Indicadores de desempeño: a1, a3,
Declaración
Pseudocódigo
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Sintaxis C#
void Insertion_sort(int* t)
{
int i, j;
int actual;
actual = t[i];
t[j] = actual;
Recorrido
Pseudocódigo
Fin Procedimiento;
El ordenamiento por inserción, aunque sigue siendo O(n2)O(n2), funciona de una manera ligeramente
diferente. Siempre mantiene una sublista ordenada en las posiciones inferiores de la lista. Cada ítem
nuevo se “inserta” de vuelta en la sublista previa de manera que la sublista ordenada sea un ítem más
larga. La Figura 4 muestra el proceso de ordenamiento por inserción. Los ítems sombreados representan
las sublistas ordenadas a medida que el algoritmo lleva a cabo cada pasada.
Recorrido
Fin Procedimiento;
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Un banco tiene 3 clientes que pueden hacer depósitos y extracciones. También el banco requiere que al
final del día calcule la cantidad de dinero que hay depositada.
La Solución tendrá el siguiente esquema: Debemos definir los atributos y los métodos de cada clase:
Cliente
atributos
nombre
monto
métodos
constructor
Depositar
Extraer
RetornarMonto
4.1. DISEÑO
4.1.1. Pseudocódigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PruebaVector
class PruebaVector
string linea;
linea = Console.ReadLine();
int cant;
cant = int.Parse(linea);
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
linea = Console.ReadLine();
vector[f] = int.Parse(linea);
int auxili;
int j;
auxili = vector[i];
j = i - 1;
vector[j + 1] = vector[j];
j--;
vector[j + 1] = auxili;
Console.Write(vector[f]+" ");
}
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Console.ReadKey();
pv.Cargar();
pv.InsercionDirecta();
pv.Imprimir();
Desarrollar la implementacion en
C#
V. REFERENCIAS BIBLIOGRÁFICAS
3
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Declaración
Pseudocódigo
minimo = i;
Sintaxis Java
int min = i;
{
if (a[j] < a[min])
{
min = j;
}
}
if (i != min)
{
int aux= a[i];
a[i] = a[min];
a[min] = aux;
}
}}
3
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Recorrido
Pseudocódigo
minimo = j
fin si
fin para
intercambiar(lista[i], lista[minimo])
fin para
Este algoritmo mejora ligeramente el algoritmo de la burbuja. En el caso de tener que ordenar un vector
de enteros, esta mejora no es muy sustancial, pero cuando hay que ordenar un vector de estructuras más
complejas, la operación intercambiar() sería más costosa en este caso. Este algoritmo realiza muchas
menos operaciones intercambiar() que el de la burbuja, por lo que lo mejora en algo. Si la línea
comentada con (!) se sustituyera por intercambiar(lista[i], lista[j]) tendríamos una versión del algoritmo
de la burbuja (naturalmente eliminando el orden intercambiar del final).
Otra desventaja de este algoritmo respecto a otros como el de burbuja o de inserción directa es que no
mejora su rendimiento cuando los datos ya están ordenados o parcialmente ordenados. Así como, por
ejemplo, en el caso de la ordenación de burbuja se requeriría una única pasada para detectar que el
vector ya está ordenado y finalizar, en la ordenación por selección se realizarían el mismo número de
pasadas independientemente de si los datos están ordenados o no.
.
Recorrido
Consiste en encontrar el menor de todos los elementos del arreglo o vector e intercambiarlo con el que
está en la primera posición. Luego el segundo mas pequeño, y así sucesivamente hasta ordenarlo todo
minimo = j
fin para
intercambiar(lista[i], lista[minimo])
fin para
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
q-2: suponga que usted tiene que ordenar la siguiente lista de números: [11, 7, 12, 14, 19, 1, 6, 18, 8, 20]
¿cuál de las siguientes listas representa la lista parcialmente ordenada tras tres pasadas completas del
ordenamiento por selección?
4.2. DISEÑO
4.2.1. Pseudocódigo
def ordenamientoPorSeleccion(unaLista):
posicionDelMayor=0
if unaLista[ubicacion]>unaLista[posicionDelMayor]:
posicionDelMayor = ubicacion
temp = unaLista[llenarRanura]
unaLista[llenarRanura] = unaLista[posicionDelMayor]
unaLista = [54,26,93,17,77,31,44,55,20]
ordenamientoPorSeleccion(unaLista)
print(unaLista)
Desarrollar la implementacion en
Java
X. REFERENCIAS BIBLIOGRÁFICAS
2
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
El algoritmo Shell sort mejora el ordenamiento por inserción comparando elementos separados por un
espacio de varias posiciones. Esto permite que un elemento haga "pasos más grandes" hacia su posición
esperada. Los pasos múltiples sobre los datos se hacen con tamaños de espacio cada vez más pequeños. El
último paso del Shell sort es un simple ordenamiento por inserción, pero para entonces, ya está garantizado
que los datos del vector están casi ordenados.
Declaración
Pseudocódigo
FIN PROCEDURE;
Sintaxis C
{
int j,en_cours;
en_cours = t[i];
}
t[j] = en_cours;
}
}
void tri_shell(int* t) {
int intervalles[5]={6,4,3,2,1};
3
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
tri_insertion(t,intervalles[ngap],i);
Recorrido
Pseudocódigo
tri_Insertion(Tableau,gap,debut);
FIN POUR;
FIN POUR;
FIN PROCEDURE;
.
Recorrido
Consiste en encontrar el menor de todos los elementos del arreglo o vector e intercambiarlo con el que
está en la primera posición. Luego el segundo mas pequeño, y así sucesivamente hasta ordenarlo todo
tri_Insertion(Tableau,gap,debut);
FIN POUR;
FIN POUR;
4
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
[ 10 14 73 25 23 13 27 94 33 39 25 59 94 65 82 45 ]
Aquí, el 10 que estaba en el extremo final, se ha movido hasta el extremo inicial. Esta lista es entonces de nuevo
ordenada usando un ordenamiento con un espacio de 3 posiciones, y después un ordenamiento con un espacio de 1
posición (ordenamiento por inserción simple)
4.3. DISEÑO
4.3.1. Pseudocódigo
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PruebaVector
{
class PruebaVector
{
private int[] vector;
string linea;
int cant;
cant = int.Parse(linea);
{
Console.Write("Ingrese elemento "+(f+1)+": ");
linea = Console.ReadLine();
vector[f] = int.Parse(linea);
}
}
public void Shell()
{
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
int salto = 0;
int sw = 0;
int auxi = 0;
int e = 0;
salto = vector.Length / 2;
}
Console.ReadKey();
}
pv.Cargar();
pv.Shell();
pv.Imprimir();
}
}
}
Desarrollar la implementacion en C
3
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
1
XVI. FUNDAMENTOS TEÓRICOS
Este método es una mejora sustancial del método de intercambio directo y recibe el nombre de Quick Sort, por la
velocidad con la que ordena los elementos del arreglo.
Quicksort es un algoritmo basado en la técnica de divide y vencerás, que permite, en promedio, ordenar n
elementos en un tiempo proporcional a n log n.
Declaración
Pseudocódigo
INICIO
Llenar(A)
Algoritmo quicksort(A,inf,sup)
i<-inf
j<-sup
x<-A[(inf+sup)div 2]
Sintaxis C#
{
int j,en_cours;
en_cours = t[i];
}
t[j] = en_cours;
}
}
4
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
void tri_shell(int* t) {
int intervalles[5]={6,4,3,2,1};
tri_insertion(t,intervalles[ngap],i);
Recorrido
Pseudocódigo
5
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
FIN
6
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
.
Recorrido
i<-i+1
fin_mientras
j<- j-1
fin_mientras
si i=<j entonces
tam<-A[i]
A[i]<-A[j]
A[j]<-tam
i=i+1
j=j-1
fin_si
fin_mientras
si inf<j
llamar_a quicksort(A,inf,j)
fin_si
si i<sup
7
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
llamar_a quicksort(A,i,sup)
fin_si
FIN
Como el recorrido de izquierda a derecha debería iniciarse en la misma posición donde se encuentra el
elemento x, el proceso se termina ya que el elemento x, se encuentra en la posición correcta.
A: 12, 08, 15, 16, 44, 27, 67, 35
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace quicksort
{
class Class
{
static void Main()
{
int n;
Console.WriteLine("Metodo de Quick Sort");
Console.Write("Cuantos longitud del vector: ");
n = Int32.Parse(Console.ReadLine());
llenar b = new llenar(n);
}
}
class llenar
{
int h;
int[] vector;
public llenar(int n)
{
h = n;
vector = new int[h];
for (int i = 0; i < h; i++)
{
Console.Write("ingrese valor {0}: ", i + 1);
vector[i] = Int32.Parse(Console.ReadLine());
}
quicksort(vector, 0, h - 1);
mostrar();
}
private void quicksort(int[] vector, int primero, int ultimo)
{
int i, j, central;
double pivote;
central = (primero + ultimo) / 2;
pivote = vector[central];
i = primero;
j = ultimo;
do
{
8
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Desarrollar la implementacion en
C#
9
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
2
XXI. FUNDAMENTOS TEÓRICOS
Declaración
Pseudocódigo
MergeSort (T [ ] a, entero n)
si ( n>1) entonces
{
a1= a[0...n/2 -1] ; // Primera mitad
MergeSort(a1, n/2);
MergeSort(a2, n – n/2);
Merge(a1,a2,a, n);
}
Sintaxis Java
a este metodo no le faltara algunas llaves? Intente muchas veces y nada:'v
public static void merge(int A[],int izq, int m, int der){
int i, j, k;
int [] B = new int[A.length]; //array auxiliar
for (i=izq; i<=der; i++) //copia ambas mitades en el array auxiliar
B[i]=A[i];
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Recorrido
Pseudocódigo
.
Recorrido
El método que hemos usado para resolver este problema se llama División y Conquista, y se aplica en las
situaciones en las que vale el siguiente principio:
Para obtener una solución es posible partir el problema en varios subproblemas de tamaño menor,
resolver cada uno de esos subproblemas por separado aplicando la misma técnica (en nuestro caso
ordenar por mezcla cada una de las dos sublistas), y finalmente juntar estas soluciones parciales en una
solución completa del problema mayor (en nuestro caso la intercalación ordenada de las dos sublistas
ordenadas).
Como siempre sucede con las soluciones recursivas, debemos encontrar un caso base en el cual no se
aplica la llamada recursiva (en nuestro caso la base sería el paso 1: Si la lista es pequeña (vacía o de
tamaño 1) ya está ordenada y no hay nada que hacer). Además debemos asegurar que siempre se alcanza
el caso base, y en nuestro caso aseguramos eso porque las lista original se divide siempre en mitades
cuando su longitud es mayor que 1.
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
En el código usamos la clase vector (#include <vector.h>) para crear los vectores,
obviamente funciona igual de bien si se utilizan los arrays tipo C: TIPO V[]
4.4. DISEÑO
4.4.1. Pseudocódigo
1
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Desarrollar la implementacion en
C++
2
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Declaración
Pseudocódigo
HEAPSORT( T[ ] A, entero n) {
Sintaxis Java
}
void heapify(int* arr, int low, int high)
{
/*Start with middle element. Middle element is chosen in
such a way that the last element of array is either its
left child or right child*/
int midIdx = (high - low -1)/2;
while (midIdx >= 0)
{
shiftRight(arr, midIdx, high);
--midIdx;
}
return;
}
void heapSort(int* arr, int size)
{
assert(arr);
assert(size > 0);
/*This will put max element in the index 0*/
heapify(arr, 0, size-1);
int high = size - 1;
while (high > 0)
{
/*Swap max element with high index in the array*/
int tmp = arr[high];
arr[high] = arr[0];
arr[0] = tmp;
--high;
/*Ensure heap property on remaining elements*/
shiftRight(arr, 0, high);
}
return;
}
4
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Recorrido
Pseudocódigo
mientras(n > 1)
n--; (3)
Este algoritmo consiste en almacenar todos los elementos del vector a ordenar en un montículo (heap),
y luego extraer el nodo que queda como nodo raíz del montículo (cima) en sucesivas iteraciones
obteniendo el conjunto ordenado. Basa su funcionamiento en una propiedad de los montículos, por la
cual, la cima contiene siempre el menor elemento (o el mayor, según se haya definido el montículo) de
todos los almacenados en él. El algoritmo, después de cada extracción, recoloca en el nodo raíz o cima,
la última hoja por la derecha del último nivel. Lo cual destruye la propiedad heap del árbol. Pero, a
continuación realiza un proceso de "descenso" del número insertado de forma que se elige a cada
movimiento el mayor de sus dos hijos, con el que se intercambia..
Recorrido
El algoritmo, después de cada extracción, recoloca en el nodo raíz o cima, la última hoja por la derecha
del último nivel. Lo cual destruye la propiedad heap del árbol. Pero, a continuación realiza un proceso
de "descenso" del número insertado de forma que se elige a cada movimiento el mayor de sus dos hijos,
con el que se intercambia..
mientras(n > 1)
n--; (3)
5
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
Claro para poder aplicar este método es algún software, uno requiere de un código, un cogido
que es un tanto largo, enseguida se le mostrara un ejemplo de código en C++ :
6
UNIVERSIDAD ANDINA DEL CUSCO
FACULTAD DE INGENIERÍA Y ARQUITECTURA
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Estructura de datos
SEM 2020 – I
assert(arr);
assert(size > 0);
/*This will put max element in the index 0*/
heapify(arr, 0, size-1);
int high = size - 1;
while (high > 0)
{
/*Swap max element with high index in the array*/
int tmp = arr[high];
arr[high] = arr[0];
arr[0] = tmp;
--high;
/*Ensure heap property on remaining elements*/
shiftRight(arr, 0, high);
}
return;
}
Desarrollar la implementacion en
C++