Véletlenszerű rendezés

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2018. január 11-én felülvizsgált verziótól ; az ellenőrzések 28 szerkesztést igényelnek .

A véletlenszerű rendezés vagy a Shaker rendezés vagy a kétirányú ( ang.  Cocktail sort ) egyfajta buborékos rendezés . A buborékos rendezési módszert elemezve két dolgot lehet megjegyezni.

Először is, ha a tömb egy részén történő mozgás során nem fordul elő permutáció, akkor a tömbnek ez a része már rendezve van, és ezért kizárható a figyelembevételből.

Másodszor , amikor a tömb végéről az elejére haladunk, a minimális elem „lebeg” az első pozícióba, és a maximális elem csak egy pozícióval tolódik el jobbra.

Ez a két ötlet a buborékok rendezési módszerének következő módosításaihoz vezet. A tömb működő részének (vagyis a tömb azon részének, ahol mozgás történik) határai minden iterációnál az utolsó csere helyén vannak beállítva . A tömböt felváltva jobbról balra és balról jobbra szkenneljük.

C++

#include <iostream> #include <vektor> #include <ctime> void filling ( std :: vektor < 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 :: vektor < int >& arr ) { int kontroll = arr . méret () - 1 ; int balra = 0 ; int jobb = arr . méret () - 1 ; do { for ( int i = bal ; i < jobb ; i ++ ) { if ( arr [ i ] > arr [ i + 1 ]) { std :: csere ( arr [ i ], arr [ i + 1 ]); kontroll = i ; } } jobb = kontroll ; for ( int i = jobb ; i > bal ; i -- ) { if ( arr [ i ] < arr [ i - 1 ]) { std :: csere ( arr [ i ], arr [ i - 1 ]); kontroll = i ; } } bal = kontroll ; } while ( bal < jobb ); } int main () { const int N = 20 ; std :: vektor < int > arr ; arr . tartalék ( N ); for ( int i = 0 ; i < N ; i ++ ) arr . visszatolás ( 0 ); srand ( idő ( 0 )); töltés ( arr ); shakerSort ( arr ); for ( int i = 0 ; i < arr . size (); i ++ ) { std :: cout << arr [ i ] << " " ; } arr . tiszta (); std :: cin . figyelmen kívül hagyja (); }

C#

a rendszer használatával ; névtér SortLab { class Program { static void Main () { Rendezés (); } /*Fő program*/ static void Rendezés () { int [] myint = { 99 , 88 , 77 , 66 , 55 , 44 , 33 , 22 , 11 , 8 , 5 , 3 , 1 }; WriteArray ( myint ); ShakerSort ( myint ); WriteArray ( myint ); Konzol . ReadLine (); } /* Shaker sort */ static void ShakerSort ( int [] myint ) { int left = 0 , right = myint . Hossz - 1 , szám = 0 ; while ( bal < jobb ) { for ( int i = bal ; i < jobb ; i ++) { count ++; if ( myint [ i ] > myint [ i + 1 ]) Csere ( myint , i , i + 1 ); } jobb --; for ( int i = jobb ; i > bal ; i --) { count ++; if ( myint [ i - 1 ] > myint [ i ]) Csere ( myint , i - 1 , i ); } bal ++; } Konzol . WriteLine ( "\nÖsszehasonlítások száma = {0}" , szám . ToString ()); } /* Elemek felcserélése */ static void Csere ( int [] myint , int i , int j ) { int üveg = myint [ i ]; myint [ i ] = myint [ j ]; myint [ j ] = üveg ; } /*Output array*/ static void WriteArray ( int [] a ) { foreach ( int i in a ) Console . Write ( "{0}|" , i .ToString ( )); Konzol . WriteLine ( "\n\n\n" ); } } }

JavaScript

function shakerSort ( tömb ) { hagyjuk balra = 0 ; // tömb eleje let right = array . hossza - 1 ; // tömb vége while ( left < right ) { for ( let i = left ; i < right ; i ++ ) { if ( array [ i ] > array [ i + 1 ]) { [ array [ i ], array [ i + 1 ]] = [ tömb [ i + 1 ], tömb [ i ]] } } jobb -- ; for ( legyen i = jobb ; bal < i ; i -- ) { if ( tömb [ i ] < tömb [ i - 1 ]) { [ tömb [ i ], tömb [ i - 1 ]] = [ tömb [ i - 1 ], tömb [ i ]] } } bal ++ ; } return array ; }

PHP

function cocktail Rendezés ( & $a ) { $n = count ( $a ); $bal = 0 ; $jobb = $n - 1 ; do { for ( $i = $bal ; $i < $jobb ; $i ++ ) { if ( $a [ $i ] > $a [ $i + 1 ]) { list ( $a [ $i ], $a [ $i + 1 ]) = tömb ( $a [ $i + 1 ], $a [ $i ]); } } $jobb -- ; for ( $i = $jobb ; $i > $bal ; $i -- ) { if ( $a [ $i ] < $a [ $i - 1 ]) { list ( $a [ $i ], $a [ $i - 1 ]) = tömb ( $a [ $i - 1 ], $a [ $i ]); } } $bal ++ ; } while ( $bal <= $jobb ); }

VAGY

function FunctionCoocktailSort ( & $array ) { $leftItem = 0 ; $rightItem = count ( $tömb ) - 1 ; for ( $i = $leftItem ; $i < $rightItem ; $i ++ ) { for ( $j = $leftItem ; $j < $rightItem ; $j ++ ) { if ( $tömb [ $j ] > $ tömb [ $j + 1 ]) { FunctionSwapVariables ( $tömb [ $j ], $tömb [ $j + 1 ]); } } $rightItem -- ; for ( $j = $rightItem ; $j > $leftItem ; $j -- ) { if ( $tömb [ $j ] < $tömb [ $j - 1 ]) { FunctionSwapVariables ( $tömb [ $j ], $tömb [ $j - 1 ]); } } } }

Java

public static void main ( String [ ] args ) { fillArray ( arr ); shakerSort ( arr ); Rendszer . ki . println ( Tömbök . toString ( arr )); } privát static void fillArray ( int arr [] ) { for ( int i = 0 ; i < arr . hossz ; i ++ ) { arr [ i ] = ( int ) ( Math . random () * 10 + 1 ); } Rendszer . ki . println ( Tömbök . toString ( arr )); } public static void shakerSort ( int arr [] ) { int buff ; int balra = 0 ; int jobb = arr . hossza - 1 ; do { for ( int i = bal ; i < jobb ; i ++ ) { if ( arr [ i ] > arr [ i + 1 ] ) { buff = arr [ i ] ; arr [ i ] = arr [ i + 1 ] ; arr [ i + 1 ] = buff ; } } jobb -- ; for ( int i = jobb ; i > bal ; i -- ) { if ( arr [ i ] < arr [ i - 1 ] ) { buff = arr [ i ] ; arr [ i ] = arr [ i - 1 ] ; arr [ i - 1 ] = buff ; } } bal ++ ; } while ( bal < jobb ); }

Python

minta = [ 0 , - 1 , 5 , - 2 , 3 ] bal = 0 jobb = len ( minta ) - 1 míg balra <= jobbra : i tartományban ( balra , jobbra , +1 ) : _ _ ha minta [ i ] > minta [ i + 1 ]: minta [ i ], minta [ i + 1 ] = minta [ i + 1 ], minta [ i ] jobb -= 1 i tartományban ( jobbra , balra , -1 ) : _ _ ha minta [ i - 1 ] > minta [ i ]: minta [ i ], minta [ i - 1 ] = minta [ i - 1 ], minta [ i ] bal += 1 nyomtatás ( minta )

T-SQL

tábla létrehozása # temp1 ( id int elsődleges kulcs azonossága , -- sorazonosító pont int --érték ) deklarálja @ left int = 0 , @right int = ( válassza ki a számot ( * ) a # temp1 közül ) - 1 , _ @i int , _ @swap int _ míg @ balra <= @ jobbra kezdődik set @i = @bal _ _ míg @ i < @ jobb + 1 kezdődik if ( válasszon pontot a # temp1 közül ahol id = @ i ) > ( válasszon pontot a # temp1 közül ahol id = @ i + 1 ) kezdődik set @ swap = ( válassza ki a pontot a # temp1 közül ahol id = @ i ) frissítés # temp1 set point = ( válasszon pontot a # temp1 közül ahol id = @ i + 1 ) ahol id = @i_ _ frissítés # temp1 alapérték = @csere _ _ ahol id = @ i + 1 vége beállítva @i = @i + 1 _ _ vége set @ right = @ right - 1 set @i = @jobbra _ _ míg @i > @bal - 1 _ _ kezdődik if ( válasszon pontot a # temp1 - ből ahol id = @ i ) < ( válasszon pontot a # temp1 - ből , ahol id = @ i - 1 ) kezdődik set @ swap = ( válassza ki a pontot a # temp1 közül ahol id = @ i ) frissítés # temp1 set point = ( válasszon pontot a # temp1 közül ahol id = @ i - 1 ) ahol id = @i_ _ frissítés # temp1 alapérték = @csere _ _ ahol id = @ i - 1 vége set @i = @i - 1 _ _ vége set @bal = @bal + 1 _ _ vége pont kiválasztása from # temp1

Fortran

sort_cocktail szubrutin ( array_size , array ) egész szám i , j integer last_unsorted , firs_unsorted , Exchange logikus módon integer , intent ( in ) :: array_size integer , intent ( inout ) :: array ( array_size ) last_unsorted = array_size firs_unsorted = 1 mód = . igaz . do j = 1 , tömb_mérete ha ( mód ) akkor do i = firs_unsorted , last_resorted - 1 if ( tömb ( i ) . gt . tömb ( i + 1 )) akkor csere = tömb ( i ) tömb ( i ) = tömb ( i + 1 ) tömb ( i + 1 ) = csere vége ha vége do utolsó_nem rendezett = utolsó_válogatatlan - 1 más do i = utolsó_rendezetlen - 1 , első rendezetlen , - 1 if ( tömb ( i ) . gt . tömb ( i + 1 )) akkor csere = tömb ( i ) tömb ( i ) = tömb ( i + 1 ) tömb ( i + 1 ) = csere vége ha vége do firs_unsorted = firs_rendezetlen + 1 vége ha mód = . nem . út if ( firs_unsorted . ge . last_unsorted ) kilépés vége do szubrutin vége

Linkek