unit UShakerSort;
interface
procedure ShakerSort(var A: array of Integer);
implementation
procedure ShakerSort(var A: array of Integer);
procedure Swap(var X, Y: Integer);
var
Swp: Integer;
begin
Swp := X;
X := Y;
Y := Swp;
end;
var
Size, Half: Integer;
I, J: Integer;
begin
Size := (High(A) - Low(A)) + 1;
Half := Size div 2;
for I := 1 to Half do
begin
for J := Low(A) to High(A) - I do
if A[J] > A[J + 1] then Swap(A[J], A[J + 1]);
for J := High(A) downto Low(A) + I do
if A[J - 1] > A[J] then Swap(A[J - 1], A[J]);
end;
end;
end.
Folgender
ShakerSort in C
ist weitgehend aus dem Buch
[PROFC S. 23f]
übernommen.
#include <stdio.h>
#include <stdlib.h>
/* Sortiert die ersten n Elemente des int-Arrays v */
void shakersort(int v[], int n) {
int lower = 1;
int higher = n - 1;
int lastswap = n - 1;
// down up down up down up down up down up down ...
do {
// bubble down
for (int i = higher; i >= lower; i--) {
if (v[i-1] > v[i]) {
int swp = v[i-1];
v[i-1] = v[i];
v[i] = swp;
lastswap = i;
}
}
lower = lastswap + 1;
// bubble up
for (int i = lower; i <= higher; i++) {
if (v[i-1] > v[i]) {
int swp = v[i-1];
v[i-1] = v[i];
v[i] = swp;
lastswap = i;
}
}
higher = lastswap - 1;
} while (lower <= higher);
}
// Kleiner Test: Lass shaken!
int main() {
int values[] = {25, 13, 19, 31, 11, 99, 21, 17};
int count = sizeof(values) / sizeof(*values);
// Ausgabe der Werte (vorher)
for (int i = 0; i < count; i++) printf("%5d", values[i]);
printf("\n");
// Sortiere alle (count!) Elemente von values
shakersort(values, count);
// Ausgabe der Werte (nachher)
for (int i = 0; i < count; i++) printf("%5d", values[i]);
printf("\n");
system("PAUSE");
return 0;
}
Dank
Christian Weßel
kann ich Ihnen auch einen ShakerSort in Perl präsentieren, sehen Sie selbst!
#!/usr/bin/perl
sub ShakerSort {
my ($comp,@list) = @_;
for (my $j=0; $j<=int(($#list)/2); $j++) {
# shaker up
for (my $i=0; $i<($#list-$j); $i++) {
if (&$comp($list[$i+1],$list[$i])) {
($list[$i],$list[$i+1]) = ($list[$i+1],$list[$i]);
}; # if $list...
}; # for $i...
# shaker down
for (my $i=$#list; $i>$j; $i--) {
if (&$comp($list[$i],$list[$i-1])) {
($list[$i-1],$list[$i]) = ($list[$i],$list[$i-1]);
}; # if $list...
}; # for $i...
}; # for $j...
return @list;
};
# --- Anwendungsbeispiel ---
# Vergleichsfunktionen
my $numAsc = sub {return $_[0] < $_[1];};
my $numDesc = sub {return $_[0] > $_[1];};
@A = (4,2,9,3,0,5,1,8,6,7);
@B = &ShakerSort($numAsc,@A);
@C = &ShakerSort($numDesc,@A);
print "# @A (unsortiert)\n";
print "#\n";
print "# @B (aufsteigend; asc)\n";
print "# @C (absteigend; desc)\n";
# --- Besondere Anwendungsbeispiele ---
@X1 = (4,2,9,3,0);
@X2 = (8,6,7);
@X3 = (5,1);
@X = &ShakerSort($numAsc, @X1,@X2,@X3);
@Y = &ShakerSort($numAsc, 4,2,9,3,0,5,1,8,6,7);
print "#\n";
print "# @X (3 Arrays sortiert)\n";
print "# @Y (Argumente sortiert)\n";
exit;