Blanda sortering

Den aktuella versionen av sidan har ännu inte granskats av erfarna bidragsgivare och kan skilja sig väsentligt från versionen som granskades den 11 januari 2018; kontroller kräver 28 redigeringar .

Blanda sortering , eller Shaker sort , eller dubbelriktad ( eng.  Cocktail sort ) är en sorts bubbelsortering . När man analyserar bubblesorteringsmetoden kan två saker noteras.

För det första , om inga permutationer inträffar när man rör sig genom en del av arrayen, är denna del av arrayen redan sorterad och därför kan den uteslutas från övervägande.

För det andra , när man flyttar från slutet av arrayen till början, "flyter" minimielementet till den första positionen, och det maximala elementet flyttas endast en position åt höger.

Dessa två idéer leder till följande modifieringar av bubblesorteringsmetoden. Gränserna för den arbetande delen av arrayen (det vill säga den del av arrayen där rörelse sker) sätts vid platsen för den sista växlingen vid varje iteration. Arrayen skannas växelvis från höger till vänster och från vänster till höger.

C++

#include <iostream> #inkludera <vektor> #inkludera <ctime> tomrumsfyllning ( std :: vektor < int > & arr ) { för ( storlek_t i = 0 ; i < arr . storlek (); ++ 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 . storlek () - 1 ; int vänster = 0 ; int höger = arr . storlek () - 1 ; gör { for ( int i = vänster ; i < höger ; i ++ ) { if ( arr [ i ] > arr [ i + 1 ]) { std :: swap ( arr [ i ], arr [ i + 1 ]); kontroll = i ; } } höger = kontroll ; for ( int i = höger ; i > vänster ; i -- ) { if ( arr [ i ] < arr [ i - 1 ]) { std :: swap ( arr [ i ], arr [ i - 1 ]); kontroll = i ; } } vänster = kontroll ; } while ( vänster < höger ); } int main () { const int N = 20 ; std :: vektor < int > arr ; arr . reserv ( N ); för ( int i = 0 ; i < N ; i ++ ) arr . pushback ( 0 ); srand ( tid ( 0 )); fyllning ( arr ); shakerSort ( arr ); for ( int i = 0 ; i < arr . storlek (); i ++ ) { std :: cout << arr [ i ] << " " ; } arr . rensa (); std :: cin . ignorera (); }

C#

använder System ; namnutrymme SortLab { class Program { static void Main () { Sort (); } /*Huvudprogram*/ static void Sortera () { int [] myint = { 99 , 88 , 77 , 66 , 55 , 44 , 33 , 22 , 11 , 8 , 5 , 3 , 1 }; WriteArray ( myint ); ShakerSort ( myint ); WriteArray ( myint ); Konsol . ReadLine (); } /* Shaker sort */ static void ShakerSort ( int [] myint ) { int left = 0 , right = myint . Längd - 1 , antal = 0 ; while ( vänster < höger ) { for ( int i = vänster ; i < höger ; i ++) { räkna ++; if ( myint [ i ] > myint [ i + 1 ]) Swap ( myint , i , i + 1 ); } höger --; for ( int i = höger ; i > vänster ; i --) { räkna ++; if ( myint [ i - 1 ] > myint [ i ]) Swap ( myint , i - 1 , i ); } vänster ++; } Konsol . WriteLine ( "\nAntal jämförelser = {0}" , count . ToString ()); } /* Swap element */ static void Swap ( int [] myint , int i , int j ) { int glass = myint [ i ]; myint [ i ] = myint [ j ]; myint [ j ] = glas ; } /*Output array*/ static void WriteArray ( int [] a ) { foreach ( int i in a ) Console . Skriv ( "{0}|" , i .ToString ( )); Konsol . WriteLine ( "\n\n\n" ); } } }

JavaScript

function shakerSort ( array ) { låt vänster = 0 ; // start av array låt höger = array . längd - 1 ; // slutet av array while ( vänster < höger ) { for ( låt i = vänster ; i < höger ; i ++ ) { if ( array [ i ] > array [ i + 1 ]) { [ array [ i ], array [ i + 1 ]] = [ array [ i + 1 ], array [ i ]] } } höger -- ; for ( låt i = höger ; vänster < i ; i -- ) { if ( array [ i ] < array [ i - 1 ]) { [ array [ i ], array [ i - 1 ]] = [ array [ i - 1 ], array [ i ]] } } vänster ++ ; } returnera array ; }

PHP

function cocktailSorting ( & $a ) { $n = count ( $a ); $left = 0 ; $höger = $n - 1 ; gör { for ( $i = $left ; $i < $right ; $i ++ ) { if ( $a [ $i ] > $a [ $i + 1 ]) { list ( $a [ $i ], $a [ $i + 1 ]) = array ( $a [ $i + 1 ], $a [ $i ]); } } $right -- ; för ( $i = $höger ; $i > $vänster ; $i -- ) { if ( $a [ $i ] < $a [ $i - 1 ]) { list ( $a [ $i ], $a [ $i - 1 ]) = array ( $a [ $i - 1 ], $a [ $i ]); } } $vänster ++ ; } while ( $left <= $right ); }

ELLER

function FunctionCoocktailSort ( & $array ) { $leftItem = 0 ; $rightItem = count ( $array ) - 1 ; for ( $i = $leftItem ; $i < $rightItem ; $i ++ ) { for ( $j = $leftItem ; $j < $rightItem ; $j ++ ) { if ( $array [ $j ] > $ array [ $j + 1 ]) { FunctionSwapVariables ( $array [ $j ], $array [ $j + 1 ]); } } $rightItem -- ; för ( $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 ); System . ut . println ( Arrays . toString ( arr )); } private static void fillArray ( int arr [] ) { for ( int i = 0 ; i < arr . längd ; i ++ ) { arr [ i ] = ( int ) ( Matte . slumpmässig () * 10 + 1 ); } System . ut . println ( Arrays . toString ( arr )); } public static void shakerSort ( int arr [] ) { int buff ; int vänster = 0 ; int höger = arr . längd - 1 ; gör { for ( int i = vänster ; i < höger ; i ++ ) { if ( arr [ i ] > arr [ i + 1 ] ) { buff = arr [ i ] ; arr [ i ] = arr [ i + 1 ] ; arr [ i + 1 ] = buff ; } } höger -- ; for ( int i = höger ; i > vänster ; i -- ) { if ( arr [ i ] < arr [ i - 1 ] ) { buff = arr [ i ] ; arr [ i ] = arr [ i - 1 ] ; arr [ i - 1 ] = buff ; } } vänster ++ ; } while ( vänster < höger ); }

Python

prov = [ 0 , - 1 , 5 , - 2 , 3 ] vänster = 0 höger = len ( exempel ) - 1 medan vänster <= höger : för i inom intervallet ( vänster , höger , +1 ) : om prov [ i ] > prov [ i + 1 ]: prov [ i ], prov [ i + 1 ] = prov [ i + 1 ], prov [ i ] höger -= 1 för i inom intervallet ( höger , vänster , -1 ) : om prov [ i - 1 ] > prov [ i ]: prov [ i ], prov [ i - 1 ] = prov [ i - 1 ], prov [ i ] vänster += 1 print ( exempel )

T-SQL

skapa tabell # temp1 ( id int primärnyckelidentitet , -- rad- ID point int --värde ) deklarera @ vänster int = 0 , @right int = ( välj antal ( * ) från # temp1 ) - 1 , _ @jag inte , _ @swap int _ medan @ vänster <= @ höger Börja ställ in @i = @vänster _ _ medan @ i < @ höger + 1 Börja if ( välj punkt från # temp1 där id = @ i ) > ( välj punkt från # temp1 där id = @ i + 1 ) Börja ställ in @ swap = ( välj punkt från # temp1 där id = @ i ) uppdatera # temp1 börvärde = ( välj punkt från # temp1 där id = @ i + 1 ) _ där id = @i _ uppdatera # temp1 börvärde = @swap _ _ där id = @ i + 1 slutet ställ in @i = @i + 1 _ _ slutet ställ in @ höger = @ höger - 1 ställ in @i = @höger _ _ medan @i > @vänster - 1 _ _ Börja if ( välj punkt från # temp1 där id = @ i ) < ( välj punkt från # temp1 där id = @ i - 1 ) Börja ställ in @ swap = ( välj punkt från # temp1 där id = @ i ) uppdatera # temp1 börvärde = ( välj punkt från # temp1 där id = @ i - 1 ) _ där id = @i _ uppdatera # temp1 börvärde = @swap _ _ där id = @ i - 1 slutet ställ in @i = @i - 1 _ _ slutet ställ in @vänster = @vänster + 1 _ _ slutet välj punkt från # temp1

Fortran

subrutin sort_cocktail ( array_size , array ) heltal i , j heltal sist_osorterat , först_osorterat , utbyte logiskt sätt heltal , avsikt ( i ) :: array_size heltal , avsikt ( inout ) :: array ( array_size ) last_unsorted = array_size först_osorterat = 1 sätt = . sant . gör j = 1 , array_size om ( sätt ) gör jag = först_osorterat , sist_osorterat - 1 if ( matris ( i ) . gt . matris ( i + 1 )) utbyte = array ( i ) array ( i ) = array ( i + 1 ) array ( i + 1 ) = utbyte sluta om slut göra last_unsorted = last_unsorted - 1 annan gör i = sist_osorterat - 1 , först_osorterat , - 1 if ( matris ( i ) . gt . matris ( i + 1 )) utbyte = array ( i ) array ( i ) = array ( i + 1 ) array ( i + 1 ) = utbyte sluta om slut göra firs_osorterat = firs_osorterat + 1 sluta om sätt = . inte . sätt om ( firs_unsorted . ge . last_unsorted ) avsluta slut göra avsluta subrutinen

Länkar