Yes sure!
Below is my zep file:
// combsort.zep
namespace Algo;
class CombSort
{
public static function launch(const int! size) -> void
{
array arr = [];//range(N,0);
int z;
int i;
for z in range(0, size - 1)
{
let arr[z] = size - z;
}
var len = count(arr);
var temp = 0.0;
int gap = len;
bool swapped = false;
int iter = 0;
while gap > 1 || swapped
{
let iter = iter + 1;
if iter > 1000000
{
break;
}
let swapped = false;
let gap = self::_newGap(gap);
let i = 0;
for i in range(0, len - gap - 1)
{
if arr[i] > arr[i + gap]
{
let swapped = true;
let temp = arr[i];
let arr[i] = arr[i + gap];
let arr[i + gap] = temp;
}
}
}
echo count(arr);
for z in range(1, size - 1)
{
if arr[z] < arr[z - 1]
{
echo "!";
}
}
}
protected static function _newGap(int! gap) -> int
{
//var tmp1 = gap / 1.3;
int tmp = (int)(gap / 1.3);
if tmp == 0
{
return 1;
}
if tmp == 9 || tmp == 10
{
return 11;
}
return tmp;
}
}
Here is where I call it:
<?php
// test file
// http://kokizzu.blogspot.be/2015/02/numeric-combsort-benchmark-updated.html
\Algo\CombSort::launch(10000);
And here is the competing PHP file:
<?php
// http://kokizzu.blogspot.be/2015/02/numeric-combsort-benchmark-updated.html
//////////////////////////////
// comb.php
function newGap($gap){
$gap /= 1.3;
$gap = (int)$gap;
if ($gap == 0)
return 1;
if($gap == 9 || $gap == 10)
return 11;
return $gap;
}
function combSort(&$a) {
$len = count($a);
$gap = $len;
$temp = 0.0;
$swapped = false;
while($gap > 1 || $swapped) {
$swapped = false;
$gap = newGap($gap);
for($i=0; $i < $len-$gap; ++$i) {
if($a[$i] > $a[$i+$gap]) {
$swapped = true;
$temp = $a[$i];
$a[$i] = $a[$i+$gap];
$a[$i+$gap] = $temp;
}
}
}
}
const N = 10000;
$arr = [];//range(N,0);
for($z=0;$z<N;++$z) $arr[] = N-$z;
combSort($arr);
for($z=1;$z<N;++$z)
{
if($arr[$z]<$arr[$z-1])
echo "!";
}
I used a Windows PowerShell tool for getting the benchmark results.