#!/usr/bin/perl use strict; use warnings; use Data::Dumper; my @unsortedData = ( 5, 4, 7, 2, 1, 3, 6, 9, 8, 10 ); print "@unsortedData\n"; mergeSort( \@unsortedData ); print "@unsortedData\n"; sub mergeSort { my( $data ) = @_; return $data if @$data < 2; # if there is less then two items it's already sorted!! my $middle = @$data / 2; my $leftSide = [ @$data[ 0 .. $middle -1 ] ]; my $rightSide = [ @$data[ $middle .. $#{ $data } ] ]; mergeSort( $leftSide ); mergeSort( $rightSide ); merge( $leftSide, $rightSide, $data ); return $data; } sub merge { my ( $groupA, $groupB, $dataRef ) = @_; my( $i, $j, $k ) = (0)x3; @$dataRef[$k++] = $groupA->[$i] <= $groupB->[$j] ? $groupA->[$i++] : $groupB->[$j++] while $i < @$groupA && $j < @$groupB; @$dataRef[$k++] = $groupA->[$i++] while $i < @$groupA; @$dataRef[$k++] = $groupB->[$j++] while $j < @$groupB; }