function script mergesort { .@left = getarg(0); .@right = getarg(1); if ( !getarg(5,0) ) { if ( .@right <= .@left ) return -1; .@size = .@right - .@left +1; copyarray $@tmp_array, getarg(2), .@size; } if ( .@right > .@left ) { .@mid = ( .@left + .@right ) /2; callfunc "mergesort", .@left, .@mid, $@tmp_array, getarg(3), 0, 1; callfunc "mergesort", .@mid +1, .@right, $@tmp_array, getarg(3), 0, 1; callfunc "merge", .@left, .@mid +1, .@right, $@tmp_array, getarg(3); } return .@right - .@left +1; } function script merge { .@left = getarg(0); .@mid = getarg(1); .@right = getarg(2); .@left_end = .@mid -1; .@pos = .@left; .@size = .@right - .@left +1; while ( .@left <= .@left_end && .@mid <= .@right ) { if ( getelementofarray( getarg(3), .@left ) <= getelementofarray( getarg(3), .@mid ) ) { set getelementofarray( getarg(4), .@pos ), getelementofarray( getarg(3), .@left ); .@left++; } else { set getelementofarray( getarg(4), .@pos ), getelementofarray( getarg(3), .@mid ); .@mid++; } .@pos++; } while ( .@left <= .@left_end ) { set getelementofarray( getarg(4), .@pos ), getelementofarray( getarg(3), .@left ); .@left++; .@pos++; } while ( .@mid <= .@right ) { set getelementofarray( getarg(4), .@pos ), getelementofarray( getarg(3), .@mid ); .@mid++; .@pos++; } while ( .@i < .@size ) { set getelementofarray( getarg(3), .@right ), getelementofarray( getarg(4), .@right ); .@right--; .@i++; } return; } prontera,158,185,5 script test merge sort 100,{ OnInit: sleep 1000; .@total = 1000; freeloop(1); for ( .@i = 0; .@i < .@total; ++.@i ) { .@array[.@i] = rand(10000); } .@time = gettimetick(0); callfunc "mergesort", 0, .@total -1, .@array, .@output; .@endtime = gettimetick(0); for ( .@i = 0; .@i < .@total; ++.@i ) debugmes .@output[.@i]; freeloop(0); debugmes "time used -> "+( .@endtime - .@time )+" milli-seconds"; end; } function script bottomupmergesort { .@size = getarg(0); copyarray getarg(2), getarg(1), .@size; for (.@width = 1; .@width < .@size; .@width *= 2) { // Combine sections of array a of width "width" for (.@i = 0; .@i < .@size; .@i += 2 * .@width) { .@left = .@i; .@middle = .@i + .@width; .@right = .@i + 2*.@width; if (.@size < .@middle) .@middle = .@size; if (.@size < .@right) .@right = .@size; .@i0 = .@left; .@i1 = .@middle; /* While there are elements in the left or right lists */ for (.@j = .@left; .@j < .@right; ++.@j) { /* If left list head exists and is <= existing right list head */ if (.@i0 < .@middle && (.@i1 >= .@right || getelementofarray(getarg(2), .@i0) <= getelementofarray(getarg(2), .@i1))) { .@tmp_array[.@j] = getelementofarray(getarg(2), .@i0); ++.@i0; } else { .@tmp_array[.@j] = getelementofarray(getarg(2), .@i1); ++.@i1; } } } copyarray getarg(2), .@tmp_array, .@size; } return; } prontera,158,185,5 script test bu merge sort 100,{ OnInit: sleep 6000; .@total = 1000; freeloop(1); for ( .@i = 0; .@i < .@total; ++.@i ) { .@array[.@i] = rand(10000); } .@time = gettimetick(0); callfunc "bottomupmergesort", .@total, .@array, .@output; .@endtime = gettimetick(0); for ( .@i = 0; .@i < .@total; ++.@i ) debugmes .@output[.@i]; freeloop(0); debugmes "time used -> "+( .@endtime - .@time )+" milli-seconds"; end; } // ================================================================================== // callfunc "comb_sort", , , ; function script comb_sort { .@size = getarg(2); copyarray .@arr, getarg(0), .@size; .@size = .@gap = getarg(2); .@gap10 = .@size * 10; do { if ( .@gap10 > 10 ) { .@gap10 = .@gap10 * 10 / 13; .@gap = .@gap10 / 10; } .@i = .@swap = 0; while ( .@i + .@gap < .@size ) { if ( .@arr[.@i] > .@arr[ .@i + .@gap ] ) { .@tmp = .@arr[.@i]; .@arr[.@i] = .@arr[ .@i + .@gap ]; .@arr[ .@i + .@gap ] = .@tmp; .@swap = 1; } .@i++; } } while ( .@swap || .@gap > 10 ); copyarray getarg(1), .@arr, .@size; return; } prontera,155,185,6 script test comb sort 100,{ OnInit: sleep 10000; .@total = 1000; freeloop(1); for ( .@i = 0; .@i < .@total; ++.@i ) { .@array[.@i] = rand(10000); } .@time = gettimetick(0); callfunc "comb_sort", .@array, .@output, .@total; .@endtime = gettimetick(0); for ( .@i = 0; .@i < .@total; ++.@i ) debugmes .@output[.@i]; freeloop(0); debugmes "time used -> "+( .@endtime - .@time )+" milli-seconds"; end; }