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