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.
#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 ();
}
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" );
}
}
}
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 ;
}
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 ]);
}
}
}
}
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 );
}
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 )
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
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