Add something here ...
Add something here ...
A test program from the O’Reilly® Perl Cookbook.
Formatted copy of program
#!/usr/bin/env perl # # $Id: sol4-17.pl,v 0.05 2024/04/05 16:19:18 kc4zvw Exp kc4zvw $ use 5.036_003; use strict; use warnings; # fisher_yates_shuffle( \@array ) : generate a random permutation # of @array in place sub fisher_yates_shuffle { my $array = shift; my $i; for ($i = @$array; --$i;) { my $j = int rand ($i + 1); next if $i == $j; @$array[$i, $j] = @$array[$j, $i]; } } #################### ### main program ### #################### my @array = qw/ 1 2 3 4 5 6 7 8 9 10 11 12 /; my $path_to_file = "alpha.txt"; my $handle; unless (open $handle, "<:encoding(ascii)", $path_to_file) { print STDERR "Could not open file '$path_to_file': $!\n"; # we return 'undefined', we could also 'die' or 'croak' die "No reason to continue : $!\n"; #return undef } chomp(my @lines = <$handle>); unless (close $handle) { # what does it mean if close yields an error and you are just reading? print STDERR "Don't care error while closing - '$path_to_file'.\n"; warn "contining - $!\n"; } # assuming @array is your array: print join(", ", @array); print "\n"; fisher_yates_shuffle(\@array); print join(", ", @array); print "\n\n"; # assuming @a is your array: my @a = qw(abc def ghi jkl mno pqr stu vw xyz); print "@a"; print "\n"; fisher_yates_shuffle(\@a); print "@a"; print "\n\n"; # assuming @lines is your array: print "@lines"; print "\n"; fisher_yates_shuffle(\@lines); print "@lines"; print "\n\n"; # End of File
The output ...
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 8, 12, 7, 11, 9, 4, 3, 10, 2, 1, 6, 5 abc def ghi jkl mno pqr stu vw xyz stu abc mno pqr vw jkl ghi def xyz alpha bravo charlie delta echo foxtrot golf hotel india foxtrot echo hotel india bravo delta alpha golf charlie
Formatted copy of program
The source code for shellsort.pl
#!/usr/bin/env perl # # $Id:$ use 5.036_003; use strict; use warnings; # ***===================================================================== # ** # ** Author: David Billsbrough# ** Created: Sunday, November 10, 2024 at 15:49:49 PM (EST) # ** License: GNU General Public License - version 2 # ** Version: $Revision:$ # ** Warranty: None # ** # ** Purpose: ShellSort demo in Perl # ** # ***===================================================================== ##################### ### Subroutines ### ##################### sub process_line($handle2) { my $index = 0; my $count = 0; my $line = readline($handle2); chomp($line); # frag the newline if (($line cmp "") == 0) { CORE::break }; ### @list[$index] = $line; printf "Adding %s to array\n", $line; $count = $index + 1; return ($count); } ## ------------------------------------------------------------- sub SwapElements($a, $b) { my $j = $a; my $i = $b; return ($i, $j); } ## ------------------------------------------------------------- sub CalcListSize(@c_array) { my $count = @c_array; return $count; } sub StatusReport(@list) { my $count = &CalcListSize(@list); printf "\n\nThe list has %s elements.\n", $count; return $count; } sub DisplayTitle($param) { my $Title = $param; print("\n"); printf " %s\n", $Title; print("--------------------\n"); } sub DisplayList(@list2) { my $NumberOfItems = CalcListSize(@list2); for (my $n = 0; $n < $NumberOfItems; $n++) { printf " %s\n", $list2[$n]; } print "\n"; } sub DisplayNumbers(@list2) { my $NumberOfItems = CalcListSize(@list2); for (my $n = 0; $n < $NumberOfItems; $n++) { printf " %5d\n", $list2[$n]; } print "\n"; } ## ------------------------------------------------------------- # Shell-Metzner Sort # Adapted from Programming in Pascal, P. Grogono, Addison-Wesley, 1980 # From Borland Pascal Programs for Scientists and Engineers # by Alan R. Miller, Copyright C 1993, SYBEX Inc sub ShellSort(@list) { my @a = (); my $n = CalcListSize(@list); my $done = 0; @a = @list; #printf "number of interations = %d\n", $n; #foreach (@a) { printf "%s, ", $_; } print "\n"; my $jump = $n - 1; while ($jump > 1) { $jump = int($jump / 2); do { $done = 1; for (my $j = 0; $j < $n - $jump; $j++) { my $i = $j + $jump; if ($a[$j] gt $a[$i]) { ($a[$i], $a[$j]) = SwapElements($a[$i], $a[$j]); ## print "swapped: $a[$i] $a[$j]\n"; $done = 0; } } } until ($done == 1); } return @a } ## ------------------------------------------------------------- # Shell-Metzner Sort for Numbers # Adapted from Programming in Pascal, P. Grogono, Addison-Wesley, 1980 # From Borland Pascal Programs for Scientists and Engineers # by Alan R. Miller, Copyright C 1993, SYBEX Inc sub ShellSortNums(@list) { my @a = (); my $n = CalcListSize(@list); my $done = 0; @a = @list; #printf "number of interations = %d\n", $n; #foreach (@a) { printf "%s, ", $_; } print "\n"; my $jump = $n - 1; while ($jump > 1) { $jump = int($jump / 2); do { $done = 1; for (my $j = 0; $j < $n - $jump; $j++) { my $i = $j + $jump; if ($a[$j] > $a[$i]) { ($a[$i], $a[$j]) = SwapElements($a[$i], $a[$j]); ## print "swapped: $a[$i] $a[$j]\n"; $done = 0; } } } until ($done == 1); } return @a } ###################### ### Main program ### ###################### my @arr1 = qw//; my @array = qw/ 1 2 3 4 5 6 7 8 9 10 11 12 /; my @numarray = qw/ 12 11 10 9 8 7 6 5 4 3 2 1 /; my @arr2 = qw//; my @line = qw//; my @list = qw//; my @nums = qw//; my $handle; my $handle2; my $NumberOfItems = 0; my $path_to_file = "alpha.txt"; my $TextFile = "bravo.txt"; print "\n"; print "Shellsort Demo\n"; print "\n"; unless (open $handle, "<:encoding(ascii)", $path_to_file) { print STDERR "Could not open file '$path_to_file'.\n"; die "No reason to continue : $!\n"; #return undef } chomp(my @lines = <$handle>); @arr1 = @lines; unless (close $handle) { # what does it mean if close yields an error and you are just reading? print STDERR "Don't care error while closing - '$path_to_file'.\n"; warn "contining - $!\n"; } unless (open $handle2, "<:encoding(ascii)", $TextFile) { print STDERR "Could not open file '$TextFile' : $!\n"; die "Can't read input text file '$TextFile' for list data.\n$!\n"; } ### ($NumberOfItems, @list) = &process_line($handle2) until eof($handle2); chomp(my @list = <$handle2> @arr2 = @list; close $handle2; # # # $NumberOfItems = &StatusReport(@arr1); DisplayTitle("Unsorted list"); DisplayList(@arr1); @line = &ShellSort(@arr1); ### @line = sort(@arr1); DisplayTitle("Sorted list"); DisplayList(@line); print "\n"; # # # $NumberOfItems = &StatusReport(@arr2); DisplayTitle("Unsorted list"); DisplayList(@arr2); @list = &ShellSort(@arr2); ### @list = sort(@arr2); DisplayTitle("Sorted list"); DisplayList(@list); print "\n"; # # # $NumberOfItems = &StatusReport(@numarray); DisplayTitle("Unsorted list"); DisplayNumbers(@numarray); ### @nums = &ShellSortNums(@numarray); @nums = sort {$a <=> $b} (@numarray); DisplayTitle("Sorted list"); DisplayNumbers(@nums); print "\n"; print "Finished.\n"; # End of Script
The output of the program : shellsort.pl ...
Shellsort Demo The list has 5 elements. Unsorted list -------------------- Echo Delta Charlie Bravo Alpha Sorted list -------------------- Alpha Bravo Charlie Delta Echo The list has 26 elements. Unsorted list -------------------- Zulu Yoke X-ray Wiskey Victor Uniform Tango Siera Romeo Quebec Papa Oscar November Mike Lima Kilo Juliet India Hotel Golf Foxtrot Echo Delta Charlie Bravo Alpha Sorted list -------------------- Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo Siera Tango Uniform Victor Wiskey X-ray Yoke Zulu The list has 12 elements. Unsorted list -------------------- 12 11 10 9 8 7 6 5 4 3 2 1 Sorted list -------------------- 1 2 3 4 5 6 7 8 9 10 11 12 Finished.
How to get started learning the Perl Project ...
Add something here ...