Sorting numbers in an array

John Macdonald john-Z7w/En0MP3xWk0Htik3J/w at public.gmane.org
Wed Aug 18 12:45:22 UTC 2004


Madison,

If you want to keep the data in separate arrays,
the easiest way to sort it all is to use another
array containing indices.

# initialize multiple equal length arrays:
@name = ( ... );
@file = ( ... );
@size = ( ... );

# set up index array:
@index = sort { $size[$a] <=> $size[$b] } 0..$#size;

# print in index order:
printf "%6d %4d %s\n", $size[$_], $file[$_], $name[$_] for @index;

However, as was already pointed out, you are generally
going to be better off collecting the info into a
single combined structure and sorting it.

The combined structure will have two levels,
the bottom level will determine how you collect
together info for an individual item; the top level
will determine how you collect the individual items
together into a single structure.  At each level you
can choose a hash or an array.  Here's code to convert
the separate arrays into each form (although you would
normally just collect the info in your desired format
instead of using separate arrays and then converting):

for my $index ( 0 .. $#name ) {
    # choose one

    # hash of hash
    $hoh{$name[$index} = { file=>$file[$index], size=>$size[$index] );

    # hash of array
    $hoa{$name[$index} = [ $file[$index], $size[$index] ];

    # array of hash
    push @aoh,
	{   name=>$name[$index],
	    file=>$file[$index],
	    size=>$size[$index]
	);

    # array of array
    push @aoa,
	[   $name[$index],
	    $file[$index],
	    $size[$index]
	];
}

If you use a hash for the top level (hash of xxx)
form, then you will need to use an array of keys to
hold the sorted order (as was shown in an earlier
post that used hash of hash).

If you use an array for the top level (array of xxx)
form, then that array can be reordered directly:

# sort array of hash by size:
@aoh = sort { $a->{size} <=> $b->{size} } @aoh;

# sort array of array by size:
@aoa = sort { $a->[2] <=> $b->[2] } @aoa;

(You can see, by comparing those two snippets, how
the choice of hash of array for the inner level of
the per-item data affects the code.)

There is a lot of discussion of this sort of data
structuring choice in each of Programming Perl,
the Perl Cookbook, and in the on-line documentation.

On Tue, Aug 17, 2004 at 11:44:10PM -0400, Madison Kelly wrote:
> Scott Elcomb wrote:
> >On Tue, 2004-08-17 at 22:51, Madison Kelly wrote:
> >
> >>Hi all,
> >>
> >>  I have an array of interger values in perl (i386 Linux 2.6 - FC2). Is 
> >>there an easy way that anyone knows to pull those values out from 
> >>smallest value to largest (or vice versa)?
> >>
> >>  Thanks!
> >
> >
> >How many dimensions are in the array?
> >
> >Single-dimensional arrays can be done quickly with sort (works with
> >floats as well)
> >
> >Eg.
> >
> >my @ints = qw(3 8 4 7 5 3 5 1);
> >my @sorted_ints = sort(@ints);
> >
> >foreach my $num (@sorted_ints) {
> >        print "$num\n";
> >}
> >
> >Hope it helps.
> >
> >- Scott.
> >
> 
> Hmm, I didn't think that far ahead (a side effect of coding so late I 
> guess... :p ). For a single-dimension array it worked great, thanks! 
> (and to Anton and Andy!).
> 
> What I need to do now though is somehow sort along with it two other 
> arrays... What I had been trying to do, and what I am realizing now 
> probably not work, is to somehow tie three arrays together and sort them 
> together. Maybe it will be clearer if I explain what I am doing:
> 
> I look at a directory and count how much space is used by the files 
> within it and how many files they are (excluding sub-directories). So 
> for example; here is the unsorted output I am working with:
> 
> -=-=- code output -=-=-
>  | |- Recording the new directory in the database as being on the 
> destination partition:
>  | |- Processing: [/], file num: [4], space within: [14.20 MB - 
> 14892387 bytes]
>  | |- Processing: [/Maddy's Images], file num: [10], space within: 
> [963.1 KB - 986168 bytes]
>  | |- Processing: [/vids], file num: [31], space within: [1.036 GB - 
> 1112068984 bytes]
>  | |- Processing: [/Maddy's Images/Anime], file num: [38], space 
> within: [6.13 MB - 6425716 bytes]
>  | |- Processing: [/Maddy's Images/Favorite], file num: [22], space 
> within: [2.65 MB - 2780829 bytes]
>  | |- Processing: [/Maddy's Images/Icons-n-stuff], file num: [2], space 
> within: [55.9 KB - 57271 bytes]
>  | |- Processing: [/Maddy's Images/Mermaids], file num: [5], space 
> within: [254.1 KB - 260205 bytes]
>  | |- Processing: [/Maddy's Images/Post], file num: [2], space within: 
> [123.9 KB - 126854 bytes]
>  | |- Processing: [/Maddy's Images/style], file num: [0], space within: 
> [0 Bytes - 0 bytes]
>  | |- Processing: [/Maddy's Images/vids], file num: [31], space within: 
> [1.036 GB - 1112068984 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers], file num: [23], space 
> within: [8.96 MB - 9393749 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Astro Boy], file num: [49], 
> space within: [2.70 MB - 2829006 bytes]
>  | |- Processing: [/Maddy's Images/Anime/chacha], file num: [91], space 
> within: [4.87 MB - 5110453 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Futaba-kun], file num: [8], 
> space within: [3.71 MB - 3888806 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ghost in the Shell], file num: 
> [73], space within: [14.04 MB - 14724290 bytes]
>  | |- Processing: [/Maddy's Images/Anime/jthm], file num: [16], space 
> within: [274.4 KB - 280959 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Lum], file num: [29], space 
> within: [2.60 MB - 2729299 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ranma], file num: [218], space 
> within: [17.21 MB - 18043144 bytes]
>  | |- Processing: [/Maddy's Images/Anime/.thumbnails], file num: [37], 
> space within: [561.7 KB - 575189 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Uh-huh], file num: [8], space 
> within: [2.04 MB - 2136178 bytes]
>  | |- Processing: [/Maddy's Images/Anime/.xvpics], file num: [1], space 
> within: [3.4 KB - 3432 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Futaba-kun/.xvpics], file num: 
> [2], space within: [9.2 KB - 9443 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ghost in the Shell/Sonic], 
> file num: [6], space within: [400.9 KB - 410529 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ghost in the 
> Shell/.thumbnails], file num: [46], space within: [619.1 KB - 634008 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ranma/Sonic], file num: [8], 
> space within: [1.67 MB - 1752506 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Ranma/.thumbnails], file num: 
> [140], space within: [1.73 MB - 1815526 bytes]
>  | |- Processing: [/Maddy's Images/Anime/Uh-huh/.thumbnails], file num: 
> [19], space within: [181.5 KB - 185836 bytes]
>  | |- Processing: [/Maddy's Images/Favorite/Mers], file num: [25], 
> space within: [6.39 MB - 6695960 bytes]
>  | |- Processing: [/Maddy's Images/Favorite/.thumbnails], file num: 
> [20], space within: [232.0 KB - 237571 bytes]
>  | |- Processing: [/Maddy's Images/Favorite/Mers/.thumbnails], file 
> num: [23], space within: [309.6 KB - 317014 bytes]
>  | |- Processing: [/Maddy's Images/Favorite/Mers/.xvpics], file num: 
> [2], space within: [9.5 KB - 9738 bytes]
>  | |- Processing: [/Maddy's Images/Icons-n-stuff/.xvpics], file num: 
> [1], space within: [3.6 KB - 3669 bytes]
>  | |- Processing: [/Maddy's Images/Mermaids/.thumbnails], file num: 
> [3], space within: [36.3 KB - 37182 bytes]
>  | |- Processing: [/Maddy's Images/Post/.thumbnails], file num: [1], 
> space within: [12.2 KB - 12492 bytes]
>  | |- Processing: [/Maddy's Images/style/.thumbnails], file num: [0], 
> space within: [0 Bytes - 0 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers/.thumbnails], file num: 
> [23], space within: [221.8 KB - 227143 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers/working], file num: [13], 
> space within: [30.94 MB - 32437947 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers/.xvpics], file num: [7], 
> space within: [31.8 KB - 32543 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers/working/.thumbnails], 
> file num: [21], space within: [196.2 KB - 200919 bytes]
>  | |- Processing: [/Maddy's Images/Wallpapers/working/.xvpics], file 
> num: [4], space within: [16.7 KB - 17086 bytes]
> 
> 
> Below here is the directory content sizes now sorted thanks to the help 
> of you guys:
> 
> 
>  | |- Sorting the directories by the size of their files (excluding 
> sub-directories):
>  | |- #0: Size: [1.036 GB - 1112068984 bytes]
>  | |- #1: Size: [1.036 GB - 1112068984 bytes]
>  | |- #2: Size: [30.94 MB - 32437947 bytes]
>  | |- #3: Size: [17.21 MB - 18043144 bytes]
>  | |- #4: Size: [14.20 MB - 14892387 bytes]
>  | |- #5: Size: [14.04 MB - 14724290 bytes]
>  | |- #6: Size: [8.96 MB - 9393749 bytes]
>  | |- #7: Size: [6.39 MB - 6695960 bytes]
>  | |- #8: Size: [6.13 MB - 6425716 bytes]
>  | |- #9: Size: [4.87 MB - 5110453 bytes]
>  | |- #10: Size: [3.71 MB - 3888806 bytes]
>  | |- #11: Size: [2.70 MB - 2829006 bytes]
>  | |- #12: Size: [2.65 MB - 2780829 bytes]
>  | |- #13: Size: [2.60 MB - 2729299 bytes]
>  | |- #14: Size: [2.04 MB - 2136178 bytes]
>  | |- #15: Size: [1.73 MB - 1815526 bytes]
>  | |- #16: Size: [1.67 MB - 1752506 bytes]
>  | |- #17: Size: [963.1 KB - 986168 bytes]
>  | |- #18: Size: [619.1 KB - 634008 bytes]
>  | |- #19: Size: [561.7 KB - 575189 bytes]
>  | |- #20: Size: [400.9 KB - 410529 bytes]
>  | |- #21: Size: [309.6 KB - 317014 bytes]
>  | |- #22: Size: [274.4 KB - 280959 bytes]
>  | |- #23: Size: [254.1 KB - 260205 bytes]
>  | |- #24: Size: [232.0 KB - 237571 bytes]
>  | |- #25: Size: [221.8 KB - 227143 bytes]
>  | |- #26: Size: [196.2 KB - 200919 bytes]
>  | |- #27: Size: [181.5 KB - 185836 bytes]
>  | |- #28: Size: [123.9 KB - 126854 bytes]
>  | |- #29: Size: [55.9 KB - 57271 bytes]
>  | |- #30: Size: [36.3 KB - 37182 bytes]
>  | |- #31: Size: [31.8 KB - 32543 bytes]
>  | |- #32: Size: [16.7 KB - 17086 bytes]
>  | |- #33: Size: [12.2 KB - 12492 bytes]
>  | |- #34: Size: [9.5 KB - 9738 bytes]
>  | |- #35: Size: [9.2 KB - 9443 bytes]
>  | |- #36: Size: [3.6 KB - 3669 bytes]
>  | |- #37: Size: [3.4 KB - 3432 bytes]
>  | |- #38: Size: [0 Bytes - 0 bytes]
>  | |- #39: Size: [0 Bytes - 0 bytes]
>  | \- Finished listing where files from this partition will be backed 
> up to!
>  -=-=- end code output -=-=-
> 
> As I print out each unsorted directory, file count and file size I fead 
> each variable into an array. I am now thinking of tieing the values 
> together into a single string, sorting them and splitting them back out 
> using a ':' as a seperator. Will the sizes still sort numberically 
> though? It also seems like a really cumbersome way of doing it, too...
> 
> Thanks!!
> 
> Madison
> --
> The Toronto Linux Users Group.      Meetings: http://tlug.ss.org
> TLUG requests: Linux topics, No HTML, wrap text below 80 columns
> How to UNSUBSCRIBE: http://tlug.ss.org/subscribe.shtml

-- 
--
The Toronto Linux Users Group.      Meetings: http://tlug.ss.org
TLUG requests: Linux topics, No HTML, wrap text below 80 columns
How to UNSUBSCRIBE: http://tlug.ss.org/subscribe.shtml





More information about the Legacy mailing list