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.

C++

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

C#

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" ); } } }

JavaScript

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 ; }

PHP

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 ]); } } } }

Java

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 ); }

Python

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 )

T-SQL

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

Fortran

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