Orden aleatorio

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 11 de enero de 2018; las comprobaciones requieren 28 ediciones .

Shuffle sort , o Shaker sort, o bidireccional ( ing.  Cocktail sort ) es una especie de bubble sort . Al analizar el método de clasificación de burbujas, se pueden observar dos cosas.

Primero , si no ocurren permutaciones al moverse a través de una parte de la matriz, entonces esta parte de la matriz ya está ordenada y, por lo tanto, puede excluirse de la consideración.

En segundo lugar , cuando se mueve desde el final de la matriz hasta el principio, el elemento mínimo "flota" a la primera posición, y el elemento máximo se desplaza solo una posición a la derecha.

Estas dos ideas conducen a las siguientes modificaciones al método de clasificación por burbuja. Los límites de la parte de trabajo de la matriz (es decir, la parte de la matriz donde se produce el movimiento) se establecen en la ubicación del último intercambio en cada iteración. La matriz se escanea alternativamente de derecha a izquierda y de izquierda a derecha.

C++

#incluir <iostream> #incluir <vector> #incluir <chora> relleno vacío ( std :: vector < int > & arr ) { for ( tamaño_t i = 0 ; i < arreglo . tamaño (); ++ i ) { arr [ i ] = static_cast < int > ( rand () % 100 ); std :: cout << arr [ i ] << " " ; } std :: cout << std :: endl ; } void shakerSort ( std :: vector < int >& arr ) { control int = arr . tamaño () - 1 ; int izquierda = 0 ; int derecha = arr . tamaño () - 1 ; hacer { for ( int i = izquierda ; i < derecha ; i ++ ) { if ( arr [ yo ] > arr [ yo + 1 ]) { std :: intercambio ( arr [ i ], arr [ i + 1 ]); control = yo ; } } derecha = controlar ; for ( int i = derecha ; i > izquierda ; i -- ) { si ( arr [ yo ] < arr [ yo - 1 ]) { std :: intercambio ( arr [ i ], arr [ i - 1 ]); control = yo ; } } izquierda = control ; } while ( izquierda < derecha ); } int principal () { const int N = 20 ; std :: vector < int > arr ; Arr . reserva ( N ); para ( int i = 0 ; i < N ; i ++ ) Arr . retroceso ( 0 ); srand ( tiempo ( 0 )); relleno ( arr ); agitadorclasificar ( arr ); for ( int i = 0 ; i < arreglo . tamaño (); i ++ ) { std :: cout << arr [ i ] << " " ; } Arr . claro (); estándar :: cin . ignorar (); }

C#

utilizando el sistema ; espacio de nombres SortLab { class Program { static void Main () { Sort (); } /*Programa principal*/ static void Sort () { int [] myint = { 99 , 88 , 77 , 66 , 55 , 44 , 33 , 22 , 11 , 8 , 5 , 3 , 1 }; WriteArray ( myint ); ShakerSort ( myint ); WriteArray ( myint ); consola _ Línea de lectura (); } /* Shaker sort */ static void ShakerSort ( int [] myint ) { int left = 0 , right = myint . Longitud - 1 , cuenta = 0 ; while ( izquierda < derecha ) { for ( int i = izquierda ; i < derecha ; i ++) { cuenta ++; if ( myint [ i ] > myint [ i + 1 ]) Swap ( myint , i , i + 1 ); } derecho --; for ( int i = derecha ; i > izquierda ; i --) { cuenta ++; if ( myint [ i - 1 ] > myint [ i ]) Swap ( myint , i - 1 , i ); } izquierda ++; } Consola . WriteLine ( "\nNúmero de comparaciones = {0}" , cuenta . ToString ()); } /* Intercambiar elementos */ static void Intercambiar ( int [] myint , int i , int j ) { int glass = myint [ i ]; miint [ i ] = miint [ j ]; myint [ j ] = vaso ; } /*Array de salida*/ static void WriteArray ( int [] a ) { foreach ( int i in a ) Console . Escribir ( "{0}|" , i .ToString ( )); consola _ WriteLine ( "\n\n\n" ); } } }

JavaScript

function shakerSort ( matriz ) { let left = 0 ; // comienzo de la matriz let right = matriz . longitud - 1 ; // fin del arreglo while ( izquierda < derecha ) { for ( let i = izquierda ; i < derecha ; i ++ ) { if ( arreglo [ i ] > arreglo [ i + 1 ]) { [ arreglo [ i ], arreglo [ i + 1 ]] = [ matriz [ i + 1 ], matriz [ i ]] } } derecha -- ; for ( sea i = derecha ; izquierda < i ; i -- ) { if ( matriz [ i ] < matriz [ i - 1 ]) { [ matriz [ i ], matriz [ i - 1 ]] = [ matriz [ i - 1 ], matriz [ i ]] } } izquierda ++ ; } devuelve matriz ; }

PHP

función ordenarCóctel ( & $a ) { $n = cuenta ( $a ); $izquierda = 0 ; $derecho = $n - 1 ; do { for ( $i = $izquierda ; $i < $derecha ; $i ++ ) { if ( $a [ $i ] > $a [ $i + 1 ]) { lista ( $a [ $i ], $a [ $i + 1 ]) = arreglo ( $a [ $i + 1 ], $a [ $i ]); } } $derecho -- ; for ( $i = $derecha ; $i > $izquierda ; $i -- ) { if ( $a [ $i ] < $a [ $i - 1 ]) { lista ( $a [ $i ], $a [ $i - 1 ]) = matriz ( $a [ $i - 1 ], $a [ $i ]); } } $izquierda ++ ; } while ( $izquierda <= $derecha ); }

O

función FunctionCoocktailSort ( & $array ) { $leftItem = 0 ; $rightItem = cuenta ( $array ) - 1 ; for ( $i = $elementoizquierdo ; $i < $elementoderecho ; $i ++ ) { for ( $j = $elementoizquierdo ; $j < $elementoderecho ; $j ++ ) { if ( $array [ $j ] > $ matriz [ $j + 1 ]) { FunctionSwapVariables ( $matriz [ $j ], $matriz [ $j + 1 ]); } } $elementoderecho -- ; for ( $j = $rightItem ; $j > $leftItem ; $j -- ) { if ( $array [ $j ] < $array [ $j - 1 ]) { FunctionSwapVariables ( $array [ $j ], $array [ $j - 1 ]); } } } }

Java

public static void main ( String [] args ) { llenarArray ( arr ); agitadorclasificar ( arr ); sistema _ fuera _ println ( Arrays . toString ( arr )); } matriz de relleno de vacío estático privado ( int arr [] ) { for ( int i = 0 ; i < arreglo . longitud ; i ++ ) { arr [ i ] = ( int ) ( Math . random () * 10 + 1 ); } sistema _ fuera _ println ( Arrays . toString ( arr )); } public static void shakerSort ( int arr [] ) { potenciador int ; int izquierda = 0 ; int derecha = arr . longitud - 1 ; hacer { for ( int i = izquierda ; i < derecha ; i ++ ) { if ( arr [ yo ] > arr [ yo + 1 ] ) { buff = arr [ yo ] ; arr [ yo ] = arr [ yo + 1 ] ; arr [ i + 1 ] = potenciar ; } } derecho -- ; for ( int i = derecha ; i > izquierda ; i -- ) { si ( arr [ yo ] < arr [ yo - 1 ] ) { buff = arr [ yo ] ; arr [ yo ] = arr [ yo - 1 ] ; arr [ i - 1 ] = potenciador ; } } izquierda ++ ; } while ( izquierda < derecha ); }

Pitón

muestra = [ 0 , - 1 , 5 , - 2 , 3 ] izquierda = 0 derecha = len ( muestra ) - 1 mientras que izquierda <= derecha : para i en el rango ( izquierda , derecha , + 1 ): si muestra [ i ] > muestra [ i + 1 ]: muestra [ i ], muestra [ i + 1 ] = muestra [ i + 1 ], muestra [ i ] derecha -= 1 para i en el rango ( derecha , izquierda , - 1 ): si muestra [ i - 1 ] > muestra [ i ]: muestra [ i ], muestra [ i - 1 ] = muestra [ i - 1 ], muestra [ i ] izquierda += 1 imprimir ( muestra )

T-SQL

crear tabla # temp1 ( id int identidad de clave principal , -- ID de fila punto int --valor ) declarar @ izquierda int = 0 , @right int = ( seleccione el recuento ( * ) de # temp1 ) - 1 , _ @yo int , _ @intercambiar int _ mientras @ izquierda <= @ derecha empezar establecer @i = @izquierda _ _ mientras que @ i < @ derecha + 1 empezar if ( seleccione el punto de # temp1 donde id = @i ) > ( seleccione el punto de # temp1 donde id = @i + 1 ) empezar establecer @ swap = ( seleccione el punto de # temp1 donde id = @ i ) actualizar # temp1 punto de ajuste = ( seleccione el punto de # temp1 donde id = @ i + 1 ) donde id = @i _ actualizar # temp1 punto de referencia = @swap _ _ donde id = @ i + 1 final establecer @i = @i + 1 _ _ final conjunto @ derecho = @ derecho - 1 establecer @i = @derecho _ _ mientras que @i > @izquierda - 1 _ _ empezar if ( seleccione el punto de # temp1 donde id = @i ) < ( seleccione el punto de # temp1 donde id = @i - 1 ) empezar establecer @ swap = ( seleccione el punto de # temp1 donde id = @ i ) actualizar # temp1 punto de ajuste = ( seleccione el punto de # temp1 donde id = @ i - 1 ) donde id = @i _ actualizar # temp1 punto de referencia = @swap _ _ donde id = @ i - 1 final conjunto @i = @i - 1 _ _ final establecer @izquierda = @izquierda + 1 _ _ final seleccionar punto de # temp1

Fortran

subrutina sort_cocktail ( array_size , array ) entero i , j entero last_unsorted , firs_unsorted , intercambio forma lógica entero , intención ( in ) :: array_size entero , intención ( inout ) :: matriz ( array_size ) last_unsorted = array_size primero_sin clasificar = 1 camino = . cierto _ hacer j = 1 , array_size si ( camino ) entonces do i = firs_unsorted , last_unsorted - 1 si ( matriz ( i ) . gt . matriz ( i + 1 )) entonces intercambio = matriz ( i ) arreglo ( yo ) = arreglo ( yo + 1 ) matriz ( i + 1 ) = intercambio terminara si terminar hacer last_unsorted = last_unsorted - 1 más do i = last_unsorted - 1 , firs_unsorted , - 1 si ( matriz ( i ) . gt . matriz ( i + 1 )) entonces intercambio = matriz ( i ) arreglo ( yo ) = arreglo ( yo + 1 ) matriz ( i + 1 ) = intercambio terminara si terminar hacer primero_sin clasificar = primero_sin clasificar + 1 terminara si camino = . no _ camino if ( firs_unsorted . ge . last_unsorted ) salir terminar hacer subrutina final

Enlaces