Náhodné řazení
Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od
verze recenzované 11. ledna 2018; kontroly vyžadují
28 úprav .
Shuffle sort , nebo Shaker sort , nebo obousměrný ( ang. Cocktail sort ) je druh bublinového řazení . Při analýze metody bublinového třídění lze zaznamenat dvě věci.
Za prvé , pokud při pohybu částí pole nedojde k žádným permutacím, pak je tato část pole již setříděna, a proto může být vyloučena z úvahy.
Za druhé , při pohybu z konce pole na začátek se minimální prvek „vznáší“ na první pozici a maximální prvek se posune pouze o jednu pozici doprava.
Tyto dvě myšlenky vedou k následujícím modifikacím metody bublinového třídění. Hranice pracovní části pole (tj. části pole, kde dochází k pohybu) jsou nastaveny v místě poslední výměny při každé iteraci. Pole je skenováno střídavě zprava doleva a zleva doprava.
#include <iostream>
#include <vektor>
#include <ctime>
void fill ( std :: vector < int >& arr ) {
for ( size_t i = 0 ; i < arr . size (); ++ i ) {
arr [ i ] = static_cast < int > ( rand () % 100 );
std :: cout << arr [ i ] << " " ;
}
std :: cout << std :: endl ;
}
void shakerSort ( std :: vector < int >& arr ) {
int control = arr . velikost () - 1 ;
int left = 0 ;
int right = arr . velikost () - 1 ;
udělat {
for ( int i = vlevo ; i < vpravo ; i ++ ) {
if ( arr [ i ] > arr [ i + 1 ]) {
std :: swap ( arr [ i ], arr [ i + 1 ]);
kontrola = i ;
}
}
vpravo = kontrola ;
for ( int i = vpravo ; i > vlevo ; i -- ) {
if ( arr [ i ] < arr [ i - 1 ]) {
std :: swap ( arr [ i ], arr [ i - 1 ]);
kontrola = i ;
}
}
vlevo = ovládání ;
} while ( vlevo < vpravo );
}
int main ()
{
const int N = 20 ;
std :: vector < int > arr ;
arr _ rezerva ( N );
pro ( int i = 0 ; i < N ; i ++ )
arr _ zatlačení ( 0 );
srand ( čas ( 0 ));
plnění ( arr );
shakerSort ( arr );
for ( int i = 0 ; i < arr . velikost (); i ++ ) {
std :: cout << arr [ i ] << " " ;
}
arr _ jasné ();
std :: cin . ignorovat ();
}
pomocí System ;
jmenný prostor SortLab
{
class Program
{
static void Main ()
{
Třídit ();
}
/*Hlavní program*/
static void Seřadit ()
{
int [] myint = { 99 , 88 , 77 , 66 , 55 , 44 , 33 , 22 , 11 , 8 , 5 , 3 , 1 };
WriteArray ( myint );
ShakerSort ( myint );
WriteArray ( myint );
Konzole . ReadLine ();
}
/* Shaker sort */
static void ShakerSort ( int [] myint )
{
int left = 0 ,
right = myint . Délka - 1 ,
počet = 0 ;
while ( left < right )
{
for ( int i = left ; i < right ; i ++)
{
count ++;
if ( myint [ i ] > myint [ i + 1 ])
Zaměnit ( myint , i , i + 1 );
}
vpravo --;
for ( int i = vpravo ; i > vlevo ; i --)
{
pocet ++;
if ( myint [ i - 1 ] > myint [ i ])
Swap ( myint , i - 1 , i );
}
vlevo ++;
}
Konzole . WriteLine ( "\nPočet porovnání = {0}" , počet . ToString ());
}
/* Zaměnit prvky */
static void Zaměnit ( int [] myint , int i , int j )
{
int glass = myint [ i ];
myint [ i ] = myint [ j ];
myint [ j ] = sklo ;
}
/*Output array*/
static void WriteArray ( int [] a )
{
foreach ( int i v a )
Konzole . Napište ( "{0}|" , i .ToString ( ));
Konzole . WriteLine ( "\n\n\n" );
}
}
}
function shakerSort ( pole ) {
let left = 0 ; // začátek pole
nechť vpravo = pole . délka - 1 ; // konec pole
while ( vlevo < vpravo ) {
for ( nechť i = vlevo ; i < vpravo ; i ++ ) {
if ( pole [ i ] > pole [ i + 1 ]) {
[ pole [ i ], pole [ i + 1 ]] = [ pole [ i + 1 ], pole [ i ]]
}
}
vpravo -- ;
for ( nechť i = vpravo ; vlevo < i ; i -- ) {
if ( pole [ i ] < pole [ i - 1 ]) {
[ pole [ i ], pole [ i - 1 ]] = [ pole [ i - 1 ], pole [ i ]]
}
}
vlevo ++ ;
}
return pole ;
}
function cocktailSorting ( & $a ) {
$n = count ( $a );
$left = 0 ;
$vpravo = $n - 1 ;
do {
for ( $i = $left ; $i < $right ; $i ++ ) {
if ( $a [ $i ] > $a [ $i + 1 ]) {
seznam ( $a [ $i ], $a [ $i + 1 ]) = pole ( $a [ $i + 1 ], $a [ $i ]);
}
}
$vpravo -- ;
for ( $i = $right ; $i > $left ; $i -- ) {
if ( $a [ $i ] < $a [ $i - 1 ]) {
seznam ( $a [ $i ], $a [ $i - 1 ]) = pole ( $a [ $i - 1 ], $a [ $i ]);
}
}
$left ++ ;
} while ( $left <= $right );
}
NEBO
function FunctionCoocktailSort ( & $array )
{
$leftItem = 0 ;
$rightItem = count ( $array ) - 1 ;
for ( $i = $leftItem ; $i < $rightItem ; $i ++ ) {
for ( $j = $leftItem ; $j < $rightItem ; $j ++ ) {
if ( $array [ $j ] > $ pole [ $j + 1 ]) {
FunctionSwapVariables ( $pole [ $j ], $pole [ $j + 1 ]);
}
}
$rightItem -- ;
for ( $j = $rightItem ; $j > $leftItem ; $j -- ) {
if ( $array [ $j ] < $array [ $j - 1 ]) {
FunctionSwapVariables ( $array [ $j ], $array [ $j - 1 ]);
}
}
}
}
public static void main ( String [] args ) {
fillArray ( arr );
shakerSort ( arr );
Systém . ven . println ( Arrays . toString ( arr ));
}
private static void fillArray ( int arr [] ) {
for ( int i = 0 ; i < arr . délka ; i ++ ) {
arr [ i ] = ( int ) ( Matematika . náhodný () * 10 + 1 );
}
Systém . ven . println ( Arrays . toString ( arr ));
}
public static void shakerSort ( int arr [] ) {
int buff ;
int left = 0 ;
int right = arr . délka - 1 ;
udělat {
for ( int i = vlevo ; i < vpravo ; i ++ ) {
if ( arr [ i ] > arr [ i + 1 ] ) {
buff = arr [ i ] ;
arr [ i ] = arr [ i + 1 ] ;
arr [ i + 1 ] = buff ;
}
}
pravý -- ;
for ( int i = vpravo ; i > vlevo ; i -- ) {
if ( arr [ i ] < arr [ i - 1 ] ) {
buff = arr [ i ] ;
arr [ i ] = arr [ i - 1 ] ;
arr [ i - 1 ] = buff ;
}
}
vlevo ++ ;
} while ( vlevo < vpravo );
}
vzorek = [ 0 , - 1 , 5 , - 2 , 3 ]
vlevo = 0
vpravo = len ( ukázka ) - 1
zatímco vlevo <= vpravo :
pro i v dosahu ( vlevo , vpravo , + 1 ):
pokud vzorek [ i ] > vzorek [ i + 1 ]:
vzorek [ i ], vzorek [ i + 1 ] = vzorek [ i + 1 ], vzorek [ i ]
vpravo -= 1
pro i v dosahu ( vpravo , vlevo , -1 ) :
pokud vzorek [ i - 1 ] > vzorek [ i ]:
vzorek [ i ], vzorek [ i - 1 ] = vzorek [ i - 1 ], vzorek [ i ]
vlevo += 1
tisk ( ukázka )
vytvořit tabulku # temp1
(
id int identita primárního klíče , -- ID řádku
bod int --hodnota
)
deklarovat @ left int = 0 ,
@right int = ( vyberte počet ( * ) z # temp1 ) - 1 , _
@i int , _
@swap int _
zatímco @ vlevo <= @ vpravo
začít
nastavit @i = @left _ _
zatímco @ i < @ vpravo + 1
začít
if ( vyberte bod z # temp1 kde id = @ i ) > ( vyberte bod z # temp1 kde id = @ i + 1 )
začít
set @ swap = ( vyberte bod z # temp1 kde id = @ i )
aktualizace # temp1
set point = ( vyberte bod z # temp1 kde id = @ i + 1 )
kde id = @i _
aktualizace # temp1
setpoint = @swap _ _
kde id = @ i + 1
konec
nastavit @i = @i + 1 _ _
konec
nastavit @ vpravo = @ vpravo - 1
nastavit @i = @vpravo _ _
zatímco @i > @left - 1 _ _
začít
if ( vyberte bod z # temp1 kde id = @ i ) < ( vyberte bod z # temp1 kde id = @ i - 1 )
začít
set @ swap = ( vyberte bod z # temp1 kde id = @ i )
aktualizace # temp1
set point = ( vyberte bod z # temp1 kde id = @ i - 1 )
kde id = @i _
aktualizace # temp1
setpoint = @swap _ _
kde id = @ i - 1
konec
nastavit @i = @i - 1 _ _
konec
nastavit @left = @left + 1 _ _
konec
vyberte bod
od # temp1
podprogram sort_cocktail ( array_size , array )
celé číslo i , j
celé číslo last_unsorted , firs_unsorted , výměna
logickým způsobem
integer , intent ( in ) :: array_size
celé číslo , záměr ( inout ) :: pole ( velikost_pole )
last_unsorted = velikost_pole
firs_unsorted = 1
způsob = . pravda .
do j = 1 , velikost_pole
pokud ( způsob ) pak
do i = firs_unsorted , last_unsorted - 1
if ( pole ( i ) . gt . pole ( i + 1 )) then
výměna = pole ( i )
pole ( i ) = pole ( i + 1 )
pole ( i + 1 ) = výměna
konec pokud
konec udělat
last_unsorted = last_unsorted - 1
jiný
do i = poslední_neřazeno - 1 , první_neřazeno , - 1
if ( pole ( i ) . gt . pole ( i + 1 )) then
výměna = pole ( i )
pole ( i ) = pole ( i + 1 )
pole ( i + 1 ) = výměna
konec pokud
konec udělat
firs_unsorted = firs_unsorted + 1
konec pokud
způsob = . ne . způsob
if ( firs_unsorted . ge . last_unsorted ) exit
konec udělat
ukončovací podprogram
Odkazy