Hollman Andres Barbon Florez
kristhians bethancourt
Este es el algoritmo mas sencillo y eficiente que tenemos
José Juan Alcántara Rincón
Este no es el bubble sort?
¡Hola! en esta lectura te invito a que realices el siguiente desafío: implementa un algoritmo de ordenamiento que sea capaz de ordenar de mayor a menor el set de datos dado, comparte tus resultados en la sección de comentarios, ¡comparte el código que utilizaste también!
3 94 86 82 90 10 87 36 61 8 17 15 22 10 23 78 25 2 30 45 98 43 98 59 53 57 2 64 1 41 32 58 19 99 60 74 48 80 44 25 68 1 89 77 60 25 99 30 76 32 57 82 52 44 72 87 34 87 65 30 54 6 31 33 44 44 42 82 90 17 9 98 28 86 69 3 17 8 45 98 12 47 95 43 72 39 41 82 74 56 65 79 50 26 67 100 24 67 38 57
[1, 1, 2, 2, 3, 3, 6, 8, 8, 9, 10, 10, 12, 15, 17, 17, 17, 19, 22, 23, 24, 25, 25, 25, 26, 28, 30, 30, 30, 31, 32, 32, 33, 34, 36, 38, 39, 41, 41, 42, 43, 43, 44, 44, 44, 44, 45, 45, 47, 48, 50, 52, 53, 54, 56, 57, 57, 57, 58, 59, 60, 60, 61, 64, 65, 65, 67, 67, 68, 69, 72, 72, 74, 74, 76, 77, 78, 79, 80, 82, 82, 82, 82, 86, 86, 87, 87, 87, 89, 90, 90, 94, 95, 98, 98, 98, 98, 99, 99, 100] aqui estan los numero ordenados
Hollman Andres Barbon Florez
kristhians bethancourt
Este es el algoritmo mas sencillo y eficiente que tenemos
José Juan Alcántara Rincón
Este no es el bubble sort?
Miguel Lopez
Función merge_sort
def merge_sort(lista):
""" Este if comprueba la longitud de la lista. """ if len(lista) < 2: return lista
# De lo contrario, se divide en 2
else: middle = len(lista) // 2 right = merge_sort(lista[:middle]) left = merge_sort(lista[middle:]) return merge(right, left)
Función merge
def merge(lista1, lista2): """ merge se encargara de intercalar los elementos de las dos divisiones. """ i, j = 0, 0 # Variables de incremento result = [] # Lista de resultado
Intercalar ordenadamente
while(i < len(lista1) and j < len(lista2)): if (lista1[i] < lista2[j]): result.append(lista1[i]) i += 1 else: result.append(lista2[j]) j += 1
Agregamos los resultados a la lista
result += lista1[i:] result += lista2[j:] # Retornamos el resultados return result
Prueba del algoritmo
lista = [3, 94, 86, 82, 90,
10, 87, 36, 61, 8,
17, 15, 22, 10, 23,
78, 25, 2, 30, 45,
98, 43, 98, 59, 53,
57, 2, 64, 1, 41,
32, 58, 19, 99, 60,
74, 48, 80, 44, 25,
68, 1, 89, 77, 60,
25, 99, 30, 76, 32,
57, 82, 52, 44, 72,
87, 34, 87, 65, 30,
54, 6, 31, 33, 44,
44, 42, 82, 90, 17,
9, 98, 28, 86, 69,
3, 17, 8, 45, 98,
12, 47, 95, 43, 72,
39, 41, 82, 74, 56,
65, 79, 50, 26, 67,
100, 24, 67, 38, 57]
merge_sort_result = merge_sort(lista)
print(merge_sort_result)
HECTOR MANUEL ARDILA PEREZ
Arturo Sanchez
Karen Paola Diaz Duarte
Con el merge_sort (Divide y venceras), se realiza más rápido el trabajo.
Carlos Isaac Rosales Castellanos
Ricardo Celis
ProfesorExcelente trabajo! Una pregunta, cuál es tu lenguaje favorito?
Carlos Isaac Rosales Castellanos
@ricardocelis Hola profe, creo que sería Javascript pero tal vez no sé tanto de él como me gustaría! Java es otro que me gusta también. He estado usando C a lo largo de este curso porque es el primer lenguaje de programación que aprendí y me produce bastante nostalgia y felicidad volver a programar en él!
Danelia Sanchez Sanchez
Ricardo Celis
ProfesorHola Dane! Excelente implementación
David Ramses Lugo Hernandez
Adrian Hurtado Ortiz
Alex Yovera
Juan Sebastian Mesa
Pablo Aquino
Hamlet Santana
Ernesto Jose Gabriel Lopez Bravo
Samar Jaffal
Andres David Peña Velandia
Christian Gómez
Wandy Rafael Santana Evangelista
Diego Esteban Cortés Escandón
Ricardo Celis
ProfesorExcelente trabajo Dcortes, comó has sentido el curso hasta ahora?
Cordial saludo comunidad
No es fácil para mi entender la lógica de los códigos compartidos por ustedes, comparto la solución más básica que he entendido de acuerdo a las clases anteriores, apreciaré sus comentarios y o recomendaciones para poder subir el nivel de comprensión en programación, gracias.
def mergeSort(array: list): n1 = len(array) for _ in range(n1 - 1): for i in range(n1 - 1): temp = array[i] if (array[i] > array[i+1]): array[i] = array [i + 1] array[i+1] = temp return array lista = [3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57] mergeSort(lista) print(lista)
Slds.
realice el reto usando merge sort en java
public class Ordenamiento { public int [] margeSort(int [] a)//divide en dos array y ordena { //caso base if (a.length <= 1) { return a; } else { int[] left; int[] right; right = new int[a.length / 2]; if (a.length % 2 == 0) { left = new int[a.length / 2]; } else { left = new int[(a.length / 2 + 1)]; } int i; for (i = 0; i < left.length; i++) { left[i] = a[i]; } int k = 0; for (int j = i; j < a.length; j++) { right[k] = a[j]; k++; } //recursividad int[] arrayOrdenado = merge(margeSort(left), margeSort(right)); return arrayOrdenado; } } public int [] merge(int[]b, int []c)//une los dos array en uno { int i = 0; int j = 0; int [] result = new int [b.length + c.length]; for (int k = 0; k < result.length; k++) { if (b[i] < c[j]) { result[k] = b[i]; i ++; } else{ result[k] = c[j]; j++; } if (i == b.length) { k++; for (j = j; j< c.length; j++) { result[k] = c[j]; k++; } } else if(j == c.length) { k++; for (i = i; i< b.length; i++) { result[k] = b[i]; k++; } } } return result; } public void imprimir(int [] arr) { System.out.println("impresion de array: "); for (int i = 0; i < arr.length; i++){ System.out.println(arr[i] + ","); } } public static void main(String[] args) { Ordenamiento s = new Ordenamiento(); int [] arr1 = {3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57}; int [] ordenado = s.margeSort(arr1); System.out.println("array inicial: " ); s.imprimir(arr1); System.out.println("array ordenado: "); s.imprimir(ordenado); } }
Merge Sort Python
def mergeSort(arrayData): if len(arrayData) > 1: midArray = len(arrayData)//2 leftDivide = arrayData[:midArray] rightDivide = arrayData[midArray:] mergeSort(leftDivide) mergeSort(rightDivide) # i = left, j = right, t = temporary array i = j = t = 0 while i < len(leftDivide) and j < len(rightDivide): if leftDivide[i] > rightDivide[j]: arrayData[t] = leftDivide[i] i += 1 else: arrayData[t] = rightDivide[j] j += 1 t += 1 while i < len(leftDivide): arrayData[t] = leftDivide[i] i += 1 t += 1 while j < len(rightDivide): arrayData[t] = rightDivide[j] j += 1 t += 1 if __name__ == "__main__": arrayData = [3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57] print(f'Array before merge {arrayData}') mergeSort(arrayData) print(f'Array after merge {arrayData}')
SELECTION SORT:
#include <stdio.h> void swap(int *n1, int *n2) { int temp = *n1; *n1 = *n2; *n2 = temp; } void selectionSortGreater(int S[], int n) { int i, j, greater; for (i = n - 1; i >= 0; i--) { greater = i; for (j = i; j >= 0; j--) { if (S[j] < S[greater]) greater = j; } swap(&S[i], &S[greater]); } } void print(int S[], int n) { int i; for (i = 0; i < n; i++) printf("%d, ", S[i]); printf("\n"); } int main(int argc, char const *argv[]) { int intArray[] = {3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57}; int sizeOf = sizeof(intArray) / sizeof(intArray[0]); selectionSortGreater(intArray, sizeOf); print(intArray, sizeOf); return 0; }
RESULTADO:
Les dejo la implementación del algoritmo ShellSort:
#include <stdio.h> #define N 100 void shellShort(int array[], int n) { int inc = (int)(n / 2); int j, temp; for(; inc > 0; inc /= 2) { for(int i = inc; i < n; i++) { j = i - inc; while(j >= 0) { if(array[j] <= array[j + inc]) { temp = array[j]; array[j] = array[j + inc]; array[j + inc] = temp; } else break; j = j - inc; } } } } void print_array(int arr[], int n) { for(int i = 0; i < n; i++) printf("%d, ", arr[i]); } int main() { FILE *archivo; int array[N]; archivo = fopen("datos.dat", "rb"); if(archivo != NULL) { for(int i = 0; i < N; i++) fscanf(archivo, "%d", &array[i]); fclose(archivo); shellShort(array, N); print_array(array, N); } else printf("No se leyo el archivo"); return 0; }
Resultados: https://repl.it/@DaneliaSanchez/shellSort
El algoritmo es muy parecido a uno que se hace en el curso de OOP y Algoritmos con Python. Se los recomiendo un montón y les dejo el código si les interesa:
import random def ordenamiento_mezcla(lista): if len(lista) > 1: medio = len(lista) // 2 izquierda = lista[:medio] derecha = lista[medio:] print(izquierda, "*" * 5, derecha) # Llamada recursiva en cada mitad ordenamiento_mezcla(izquierda) ordenamiento_mezcla(derecha) # Iteradores para recorrer las sublistas i = 0 j = 0 # Iterador de la lista principal k = 0 while i < len(izquierda) and j < len(derecha): if izquierda[i] < derecha[j]: lista[k] = izquierda[i] i += 1 else: lista[k] = derecha[j] j += 1 k += 1 while i < len(izquierda): lista[k] = izquierda[i] i += 1 k += 1 while j < len(derecha): lista[k] = derecha[j] j += 1 k += 1 print(f'Izquierda {izquierda}, derecha {derecha}') print(lista) print("-" * 50) return lista if __name__ == "__main__": list_size = int(input("¿De qué tamaño quieres la lista? ")) lista = [random.randint(0, 50) for i in range(list_size)] print(lista) print("-" * 2) lista_ordenada = ordenamiento_mezcla(lista) print(lista_ordenada)```
Aquí esta mi código utilizando un bubble sort
def bubble_sort(arr): for i in range(len(arr)-1, 0, -1): for j in range(i): if arr[j] > arr[j+1]: temp = arr [j] arr[j] = arr[j+1] arr[j+1] = temp print(arr) bubble_sort([3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57])```
Hola, realicé el ordenamiento mediante merge-Sort usando recursividad.
const data = require('./data.json'); /* el archivo contiene este formato: { "valores": [ 3, 94, 86, . ] } */ arreglo = data.valores; let mergeSort = (arreglo) => { //posiciones: let inicio = 0; let final = arreglo.length + 1 || size - 1; //tamaño del arreglo let medio = (inicio + final)/2; //dividir arreglo: if(arreglo.length != 1){ //dividir let arreglo1 = arreglo.splice(0, medio); let arreglo2 = arreglo.splice(-medio); mergeSort(arreglo1); mergeSort(arreglo2); //unir merge(arreglo, arreglo1, arreglo2); } } let merge = ( arreglo, arreglo1, arreglo2) => { let n = arreglo1.length + arreglo2.length // tamaño total del arreglo let pos1 = 0; let pos2 = 0; for (let i = 0; i < n; i++) { if( pos1 < arreglo1.length && pos2 < arreglo2.length){ if( arreglo1[pos1] <= arreglo2[pos2] ){ arreglo[i] = arreglo1[pos1]; pos1++; }else{ arreglo[i] = arreglo2[pos2]; pos2++; } }else{ if (pos1 < arreglo1.length){ arreglo[i] = arreglo1[pos1]; pos1++; } if (pos2 < arreglo2.length){ arreglo[i] = arreglo2[pos2]; pos2++; } } } } let imprimir = (arreglo) =>{ console.log(arreglo); } mergeSort(arreglo); imprimir( arreglo ); /* resultado: [ 1, 1, 2, 2, 3, 3, 6, 8, 8, 9, 10, 10, 12, 15, 17, 17, 17, 19, 22, 23, 24, 25, 25, 25, 26, 28, 30, 30, 30, 31, 32, 32, 33, 34, 36, 38, 39, 41, 41, 42, 43, 43, 44, 44, 44, 44, 45, 45, 47, 48, 50, 52, 53, 54, 56, 57, 57, 57, 58, 59, 60, 60, 61, 64, 65, 65, 67, 67, 68, 69, 72, 72, 74, 74, 76, 77, 78, 79, 80, 82, 82, 82, 82, 86, 86, 87, 87, 87, 89, 90, 90, 94, 95, 98, 98, 98, 98, 99, 99, 100 ]*/```
mergeSort en python
def mergeSort(lista): if len(lista) > 1: mid = len(lista) // 2 izq = lista[:mid] der = lista[mid:] mergeSort(izq) mergeSort(der) i = j = k = 0 while i < len(izq) and j < len(der): if izq[i] > der [j]: lista[k] = izq[i] i += 1 else: lista[k] = der[j] j += 1 k += 1 while i < len(izq): lista[k] = izq[i] i += 1 k += 1 while j < len(der): lista[k] = der[j] j += 1 k += 1 return lista if __name__ == '__main__': lista = [ 3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57 ] lista_ordenada = mergeSort(lista) print(lista_ordenada)```
Reto, resuelto con merge sort
#include<stdio.h> int merge(int arr[],int l,int m,int h) { int temp[h-l+1]; int i=l,j=m+1, k=0; while (i<=m && j<=h) { if (arr[i]<=arr[j]) { temp[k]=arr[i]; k++; i++; } else { temp[k]=arr[j]; k++; j++; } } while (i<=m) { temp[k]=arr[i]; k++; i++; } while (j<=h) { temp[k]=arr[j]; k++; j++; } for (i = l; i <=h ; i++) { arr[i]=temp[i-l]; } return 0; } int merge_sort(int arr[],int low,int high) { int mid; if(low<high) { mid=(low+high)/2; // Divide and Conquer merge_sort(arr,low,mid); merge_sort(arr,mid+1,high); // Combine merge(arr,low,mid,high); } return 0; } int main() { int n,i; int arr[]={3,94,86,82,90,10,87,36,61,8,17,15,22,10,23,78,25,2,30,45,98,43,98,59,53,57,2,64,1,41,32,58,19,99,60,74,48,80,44,25,68,1,89,77,60,25,99,30,76,32,57,82,52,44,72,87,34,87,65,30,54,6,31,33,44,44,42,82,90,17,9,98,28,86,69,3,17,8,45,98,12,47,95,43,72,39,41,82,74,56,65,79,50,26,67,100,24,67,38,57 }; n=sizeof(arr)/sizeof(arr[0]); merge_sort(arr,0,n-1); // sort the array printf("Sorted array:"); // print sorted array for(i=0;i<n;i++) printf("%d, ",arr[i]); return 0; }
#include<stdio.h> int arr[]={3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57}; int n = sizeof(arr)/sizeof(arr[0]); int main() { int i; merge_sort(arr,0,n-1); // sort the array printf("Sorted array: {"); // print sorted array for(i=0;i<n;i++) printf("%d, ",arr[i]); printf("}"); return 0; } int merge_sort(int arr[],int low,int high) { int mid; if(low<high) { mid=(low+high)/2; // Divide and Conquer merge_sort(arr,low,mid); merge_sort(arr,mid+1,high); // Combine merge(arr,low,mid,high); } return 0; } int merge(int arr[],int l,int m,int h) { int arr1[n/2],arr2[n/2]; // Two temporary arrays to hold the two arrays to be merged int n1,n2,i,j,k; n1=m-l+1; n2=h-m; for(i=0;i<n1;i++) arr1[i]=arr[l+i]; for(j=0;j<n2;j++) arr2[j]=arr[m+j+1]; arr1[i]=9999; // To mark the end of each temporary array arr2[j]=9999; i=0;j=0; for(k=l;k<=h;k++) //process of combining two sorted arrays { if(arr1[i]<=arr2[j]) arr[k]=arr1[i++]; else arr[k]=arr2[j++]; } return 0; } Resultado: Sorted array: {1, 1, 2, 2, 3, 3, 6, 8, 8, 9, 10, 10, 12, 15, 17, 17, 17, 19, 22, 23, 24, 25, 25, 25, 26, 28, 30, 30, 30, 31, 32, 32, 33, 34, 36, 38, 39, 41, 41, 42, 43, 43, 44, 44, 44, 44, 45, 45, 47, 48, 50, 52, 53, 54, 56, 57, 57, 57, 58, 59, 60, 60, 61, 64, 65, 65, 67, 67, 68, 69, 72, 72, 74, 74, 76, 77, 78, 79, 80, 82, 82, 82, 82, 86, 86, 87, 87, 87, 89, 90, 90, 94, 95, 98, 98, 98, 98, 99, 99, 100, }
agregando una decisión en el código:
DATA = [ 3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57 ] def merge_sort(not_ordered_list): amount_data = len(not_ordered_list) ordered_list = [] answer = str(input('do you want to order the data from min or max?: ')) if answer == 'max': while len(ordered_list) != amount_data: ordered_list += [max(not_ordered_list)] not_ordered_list.remove(max(not_ordered_list)) return ordered_list elif answer == 'min': while len(ordered_list) != amount_data: ordered_list += [min(not_ordered_list)] not_ordered_list.remove(min(not_ordered_list)) return ordered_list else: print('You must enter min or max') if __name__ == '__main__': ordered_data = merge_sort(DATA) print(ordered_data)```
Merge Sort (JAVA):
public class MergeSort { // Driver method public static void main(String args[]) { int arr[] = {3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57}; System.out.println("Given Array"); printArray(arr); MergeSort ob = new MergeSort(); ob.sort(arr, 0, arr.length-1); System.out.println("\nSorted array"); printArray(arr); } void sort(int arr[], int l, int r) { if (l < r) { int m = (l+r)/2; sort(arr, l, m); sort(arr , m+1, r); merge(arr, l, m, r); } } void merge(int arr[], int l, int m, int r) { int n1 = m - l + 1; int n2 = r - m; int L[] = new int [n1]; int R[] = new int [n2]; for (int i=0; i<n1; ++i) L[i] = arr[l + i]; for (int j=0; j<n2; ++j) R[j] = arr[m + 1+ j]; int i = 0, j = 0; int k = l; while (i < n1 && j < n2) { if (L[i] >= R[j]) { arr[k] = L[i]; i++; } else { arr[k] = R[j]; j++; } k++; } while (i < n1) { arr[k] = L[i]; i++; k++; } while (j < n2) { arr[k] = R[j]; j++; k++; } } static void printArray(int arr[]) { int n = arr.length; for (int i=0; i<n; ++i) System.out.print(arr[i] + " "); System.out.println(); } }
Usé el método de QuickSort en Python3 ya que me parece que es muy fácil de entender ese método:
def ordenar(not_ordened_list): if len(not_ordened_list) == 0: return [] elif len(not_ordened_list) ==1: return not_ordened_list left = [] right = [] equals = [] pivote = not_ordened_list[0] for n in not_ordened_list[1:]: if pivote > n: left.append(n) elif pivote < n: right.append(n) elif pivote == n: equals.append(n) return ordenar(left) + [pivote] + equals + ordenar(right) def run(): not_ordened_list = [ 3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57] print('LISTA NO ORDENADA') print(not_ordened_list) ordened_list = ordenar(not_ordened_list) print('\nLISTA ORDENADA') print(ordened_list) if __name__ == '__main__': run()```
#include <stdio.h> #include <stdlib.h> int main() { int arreglo[] ={ 3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53,57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60 }; //*/ int tam = sizeof(arreglo)/sizeof(arreglo[0]); /*//Se ingresa el tamaño del arreglo int tam; printf("Ingrese el tamaño del arreglo: "); scanf("%i", &tam); //Se ingresan los valores del arreglo printf("Ingrese los %i valores del arreglo: ", tam); for(int i=0; i<tam; i++) { scanf("%i", &arreglo[i]); } //Se imprimen lo valores del arreglo int i = 0; printf("Los valores del arreglo son: ["); while(i<tam) { printf("%i,", arreglo[i]); i++; } printf("] \n"); */ //Se realiza el proceso de merge, donde se Divide, Ordena y Combina. merge_sort(arreglo, 0, tam-1); //Se realiza la impresion del arreglo ordenado printf("El arreglo ordenado queda de la siguiente manera: ["); for(int i=0;i<tam;i++) printf("%d, ",arreglo[i]); printf("] \n"); return 0; } int merge_sort(int arreglo[], int low, int high) { int mid; if(low<high) { //Se escoge una mitad del arreglo mid = (low+high)/2; //Divide et Impera merge_sort(arreglo,low,mid); merge_sort(arreglo,mid+1,high); //Combina merge(arreglo,low,mid,high); } return 0; } int merge(int arreglo[], int l, int m, int h) { //Las dos divisiones realizadas por los merge. Se dividiran en estos dos arreglos. int arr1[10]; int arr2[10]; int n1, n2, i, j, k; //a traves de estos calculos se establecen los limetes para cada arreglo. n1 = m-l+1; n2 = h-m; //Los limetes establicidos nos ayudaran a ordenar los números establecidos en cada arreglo. //Se ordenan los números. for(i=0; i<n1; i++) arr1[i] = arreglo[l+i]; for(j=0; j<n2; j++) arr2[j] = arreglo[m+j+1]; //Las siguientes lineas establencen el limite del final de cada arreglo arr1[i] = 9999; arr2[i] = 9999; //Se reinician los valores de I y J i=0; j=0; // El siguiente ciclo, se encargará de combinar los dos arreglos. llegando asi a la fase final del algoritmo for(k=0; k<=h; k++) { if(arr1[i] <= arr2[j]) arreglo[k] = arr1[i++]; else arreglo[k] = arr2[j++]; } return 0; }```
Utilize el Merge Sort por su versatilidad con muchos datos, lo hice en JS:
function merge(leftArr, rightArr) { var sortedArr = []; while (leftArr.length && rightArr.length) { if (leftArr[0] <= rightArr[0]) { sortedArr.push(leftArr[0]); leftArr = leftArr.slice(1) } else { sortedArr.push(rightArr[0]); rightArr = rightArr.slice(1) } } while (leftArr.length) sortedArr.push(leftArr.shift()); while (rightArr.length) sortedArr.push(rightArr.shift()); return sortedArr; } function mergesort(arr) { if (arr.length < 2) { return arr; } else { var midpoint = parseInt(arr.length / 2); var leftArr = arr.slice(0, midpoint); var rightArr = arr.slice(midpoint, arr.length); return merge(mergesort(leftArr), mergesort(rightArr)); } } let unsortedArr = [3, 94, 86, 82, 90, 10, 87, 36, 61, 8, 17, 15, 22, 10, 23, 78, 25, 2, 30, 45, 98, 43, 98, 59, 53, 57, 2, 64, 1, 41, 32, 58, 19, 99, 60, 74, 48, 80, 44, 25, 68, 1, 89, 77, 60, 25, 99, 30, 76, 32, 57, 82, 52, 44, 72, 87, 34, 87, 65, 30, 54, 6, 31, 33, 44, 44, 42, 82, 90, 17, 9, 98, 28, 86, 69, 3, 17, 8, 45, 98, 12, 47, 95, 43, 72, 39, 41, 82, 74, 56, 65, 79, 50, 26, 67, 100, 24, 67, 38, 57]; console.log('This should be the sorted array!') console.log(mergesort(unsortedArr));```
def get_data_txt(path:str): numbers_to_order:list = [] with open(path,'r',encoding='utf-8') as file: for line in file: line = line.splitlines()[0] line = line.split('\t') for number in line: numbers_to_order.append(int(number)) return numbers_to_order def order_numbers_list_bubble(list_to_order:list): len_list = len(list_to_order) for i in range(len_list): for j in range(0, len_list -1): # Comparación y cambio if list_to_order[j] > list_to_order[j+1]: supp = list_to_order[j] list_to_order[j] = list_to_order[j+1] list_to_order[j+1] = supp return list_to_order data = get_data_txt('./setDeDatos.txt') order_list = order_numbers_list_bubble(data) print(order_list)```