miércoles, 12 de agosto de 2015

Algoritmos de Ordenamiento con Python

Bubble  sort

Este método consiste en verificando cada elemento de la lista que va a ser ordenada con el siguiente, intercambiándolos de posición si están en el orden equivocado. Es necesario revisar varias veces toda la lista hasta que no se necesiten más intercambios, lo cual significa que la lista está ordenada.

#Bubble Sort

elementos = [1,3,5,4,7,9,8,6]
numero = len(elementos)
i= 0
while (i < numero):
    j = i
    while (j < numero):
        if(elementos[i] > elementos[j]):
            temp = elementos[i]
            elementos[i] = elementos[j]
            elementos[j] = temp
        j= j+1
    i=i+1

for elemento in elementos:
    print elemento


Selection sort

Consiste en encontrar el menor de todos los elementos de la lista e intercambiarlo con el que está en la primera posición. Luego el segundo más pequeño, y así sucesivamente hasta ordenar toda la lista.

#Selection Sort

def selectionsort(lista,tam):
    for i in range(0,tam-1):
        min=i
        for j in range(i+1,tam):
            if lista[min] > lista[j]:
                min=j
        aux=lista[min]
        lista[min]=lista[i]
        lista[i]=aux

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
selectionsort(A,len(A))
imprimeLista(A,len(A))


Insertion sort

Paso 0: Partimos de la siguiente lista.3 2 -1 5 0 2
Paso 1: Considerar el segundo elemento de la lista, y ordenarlo respecto al primero, desplazándolo hasta la posición correcta, si corresponde.
2 3 -1 5 0 2          Se desplaza el valor 2 antes de 3. 
Paso 2: considerar el tercer elemento de la lista, y ordenarlo respecto del primero y el segundo, desplazándolo hasta la posición correcta, si corresponde.
-1 2 3 5 0 2          Se desplaza el valor -1 antes de 2 y de 3
Paso 3Considerar el cuarto elemento de la lista, y ordenarlo respecto del primero, el segundo y el tercero, desplazándolo hasta la posición correcta, si corresponde.
-1 2 3 5 0 2
El 5 está correctamente ubicado respecto de -1, 2 y 3 (como el segmento hasta la tercera posición esta ordenado, basta con comparar con el tercer elemento del segmento para verificarlo).  
Paso N-1:
-1 0 2 3 5 2 Todos los elementos excepto el ante-último ya se encuentran ordenados.
Paso N: Considerar el N–ésimo elemento de la lista, y ordenarlo respecto del segmento formado por el primero hasta N - 1-ésim, desplazándolo hasta la posición correcta, si corresponde.
-1 0 2 2 3 5           Se dezplaza el valor 2 antes de 3 y de 5.

#Insertion Sort

def insercionDirecta(lista,tam):
    for i in range(1,tam):
        v=lista[i]
        j=i-1
        while j >= 0 and lista[j] > v:
            lista[j+1] = lista[j]
            j=j-1
        lista[j+1]=v

def imprimeLista(lista,tam):
    for i in range(0,tam):
        print lista[i]

def leeLista():
    lista=[]
    cn=int(raw_input("Dame la cantidad de numeros a ingresar: "))

    for i in range(0,cn):
        lista.append(int(raw_input("Ingrese numero %d : " % i)))
    return lista

A=leeLista()
insercionDirecta(A,len(A))
imprimeLista(A,len(A))


Merge sort

       I.    Si la lista es pequeña (vacía o de tamaño 1) ya está ordenada y no hay nada que hacer. De lo contrario hacer lo siguiente:
      II.    Dividir la lista al medio, formando dos sublistas de (aproximadamente) el mismo tamaño cada una.
     III.    Ordenar cada una de esas dos sublistas (usando este mismo método).
     IV.    Una vez que se ordenaron ambas sublistas, intercalarlas de manera ordenada.

#Merge Sort

def merge_sort(lista):

      if len(lista) < 2:
          return lista

      medio = len(lista) / 2
      izq = merge_sort(lista[:medio])
     der = merge_sort(lista[medio:])
     return merge(izq, der)

def merge(lista1, lista2):

      i, j = 0, 0
      resultado = []

      while(i < len(lista1) and j < len(lista2)):
             if (lista1[i] < lista2[j]):
                 resultado.append(lista1[i])
                 i += 1
                 else:
                       resultado.append(lista2[j]) 
                       j += 1

     resultado += lista1[i:]
     resultado += lista2[j:]

     return resultado

print "=============MERGESORT============="
lista=[]
x=int(raw_input("INGRESE EL NUMERO DE DATOS QUE DESEA ORDENAR:"))

i=1
while (i<=x):
       n=int(raw_input("INGRESE DATO:"))
       lista.append(n)
       i += 1
       lista = merge_sort(lista)
       
print "SU LISTA ORDENADA CON EL METODO MERGE SORT ES:",  lista


Quick sort

      I.    Si la lista es pequeña (vacía o de tamaño 1) ya está ordenada y no hay nada que hacer. De lo contrario hacer lo siguiente:
     II.   Tomar un elemento de la lista (por ejemplo el primero) al que llamaremos pivote y armar a partir de esa lista tres sublistas: la de todos los elementos de la lista menores al pivote, la formada sólo por el pivote, y la de los elementos mayores o iguales al pivote, pero sin contarlo al pivote.
     III.   Ordenar cada una de esas tres sublistas (usando este mismo método).
     IV. Concatenar las tres sublistas ya ordenadas.

#Quick Sort

def quicksort(lista,izq,der):

      i=izq
      j=der
      x=lista[(izq + der)/2]

      while( i <= j ):
            while lista[i]<x and j<=der:
                   i=i+1
            while x<lista[j] and j>izq:
                   j=j-1
            if i<=j:
                 aux = lista[i]; lista[i] = lista[j]; lista[j] = aux;
                 i=i+1;  j=j-1;

            if izq < j:
                quicksort(lista, izq, j);
            if i < der:
                quicksort( lista, i, der );

def imprimeLista(lista,tam):
      for i in range(0,tam):
           print lista[i]

def leeLista():
      lista=[]
      cn=int(raw_input("Cuantos elementos desea Ordenar: "))

for i in range(0,cn):
     lista.append(int(raw_input("Ingrese numero %d : " % i)))
return lista

D=leeLista()
quicksort(D,0,len(D)-1)
imprimeLista(D,len(D))






No hay comentarios:

Publicar un comentario