# -*- coding: utf-8 -*- """ Carlos J Corrada Bravo Este programa calcula el promedio de tiempo de ejecuciĆ³n de cuatro algoritmos de ordenamiento La variable maxValor define el valor maximo de los elementos de la lista La variable largoLista define el largo de las listas a ordenar La variable veces define las veces que se va a hacer el ordenamiento Al final se imprimen los promedios de cada algortimo """ from random import randint import time def isSorted(lista): return lista == sorted(lista) def mergeSort(lista): if len(lista)>1: mitad = len(lista)//2 izq = lista[:mitad] der = lista[mitad:] mergeSort(izq) mergeSort(der) idx_izq = 0 idx_der = 0 idx_lista = 0 while idx_izq < len(izq) and idx_der < len(der): if izq[idx_izq] <= der[idx_der]: lista[idx_lista] = izq[idx_izq] idx_izq += 1 else: lista[idx_lista] = der[idx_der] idx_der += 1 idx_lista += 1 while idx_izq < len(izq): lista[idx_lista] = izq[idx_izq] idx_izq +=1 idx_lista +=1 while idx_der < len(der): lista[idx_lista] = der[idx_der] idx_der += 1 idx_lista += 1 return lista def heapSort(lista): #definan el algoritmo de ordenamiento heapsort return lista def quickSort(lista): #definan el algoritmo de ordenamiento quicksort return lista def insertionSort(lista): i = 1 while i < len(lista): if lista[i - 1] > lista[i]: j = i - 1 while j >= 0 and lista[j] > lista[j + 1]: lista[j], lista[j + 1] = lista[j + 1], lista[j] j -= 1 i += 1 return lista def shellSort(lista): gap = len(lista) / 2 while gap >= 1: i = gap while i < len(lista): if lista[i - gap] > lista[i]: j = i - gap while j >= 0 and lista[j] > lista[j + gap]: lista[j], lista[j + gap] = lista[j + gap], lista[j] j -= gap i += gap gap /= 2 #if isSorted(lista): #print "Lista is sorted" #else: #print "Lista is not sorted" return lista maxValor=1000 #define el valor maximo de los elementos de la lista largoLista=1000 #define el largo de las listas a ordenar veces=100 #define las veces que se va a hacer el ordenamiento acumulaMerge=0 #variable para acumular el tiempo de ejecucion del mergesort acumulaHeap=0 #variable para acumular el tiempo de ejecucion del heapsort acumulaQuick=0 #variable para acumular el tiempo de ejecucion del quicksort acumulaShell=0 #variable para acumular el tiempo de ejecucion del shellsort for i in range(veces): lista = [randint(0,maxValor) for r in range(largoLista)] #creamos una lista con valores al azar # creamos copias de la lista para cada algoritmo listaMerge = lista[:] listaHeap = lista[:] listaQuick = lista[:] listaShell = lista[:] t1 = time.clock() #seteamos el tiempo al empezar mergeSort(listaMerge) #ejecutamos el algoritmo mergeSort acumulaMerge+=time.clock()-t1 #acumulamos el tiempo de ejecucion t1 = time.clock() #seteamos el tiempo al empezar heapSort(listaHeap) #ejecutamos el algoritmo heapSort acumulaHeap+=time.clock()-t1 #acumulamos el tiempo de ejecucion t1 = time.clock() #seteamos el tiempo al empezar quickSort(listaQuick) #ejecutamos el algoritmo quickSort acumulaQuick+=time.clock()-t1 #acumulamos el tiempo de ejecucion t1 = time.clock() #seteamos el tiempo al empezar shellSort(listaShell) #ejecutamos el algoritmo shellSort acumulaShell+=time.clock()-t1 #acumulamos el tiempo de ejecucion #imprimos los resultados print "Promedio de tiempo de ejecucion de "+ str(veces) +" listas de largo " + str(largoLista) print "MergeSort " + str(acumulaMerge/veces) + " segundos" print "HeapSort " + str(acumulaHeap/veces) + " segundos" print "QuickSort " + str(acumulaQuick/veces) + " segundos" print "ShellSort " + str(acumulaShell/veces) + " segundos"