<?php
if (PHP_SAPI == 'cli') {
        define('EOL', PHP_EOL);
        define('T', "\t");
} else {
        define('EOL', "<br/>");
        define('T', "&nbsp;");
}
error_reporting(E_ALL); /*
Available algorithms:
 <= 0.010 (when size is 8000)
 - sort (native)  <= 0.100 (when size is 8000)
 - countingSort
 - quickSort  <= 0.200 (when size is 8000)
 - combSort
 - heapSort  <= 1.000 (when size is 8000)
 - mergeSort  <= 10.000 (when size is 8000)
 - shellSort  <= 20.000 (when size is 8000)
 - selectionSort
 - insertSort
 - gnomeSort
 - combinedBubbleSort  <= 30.000 (when size is 8000)
 - cocktailSort
 - bubbleSort
 - oddEvenSort
 - bubbleSortWithFlag
*/ // runTests(array('countingSort', 'heapSort', 'shellSort', 'insertSort', 'selectionSort', 'combSort', 'quickSort', 'mergeSort', 'gnomeSort', 'cocktailSort', 'oddEvenSort', 'bubbleSort', 'bubbleSortWithFlag', 'combinedBubbleSort'/*, 'stupidSort'*/), 8000, 2);
 // runTests(array('heapSort', 'countingSort'), 10000);  if (in_array('--bigInt', $argv)) {
        define('BIGINT', true);
 } else {
        define('BIGINT', false);  } $sizes = array(1, 100, 200, 400, 600, 800, 1000, 5000, 10000, 15000, 20000, 25000, 30000);
if (isset($argv[2]) && $argv[2] == 'extra') {
        $sizes = array_merge($sizes, array(40000, 50000, 100000, 200000));
        if (isset($argv[3]) && $argv[3] == 'super') {
                $sizes = array_merge($sizes, array(300000, 500000, 1000000, 2000000));
        }
} else if (isset($argv[2]) && $argv[2] == 'micro') {
        $sizes = array(1, 100, 200, 400, 600, 800, 1000);
}
if (isset($argv[1])) {
        echo "Benchmarking ".$argv[1].EOL;
        batchTest(array($argv[1]), $sizes, 3);
} else {
        batchTest(array('quickSort', 'combSort', 'mergeSort', 'shellSort'), $sizes, 3);
}
// batchTest(array('insertSort', 'selectionSort'), $sizes, 3); function countingSort(&$a) {
        $k = max($a);
        $c = array();
        $n = count($a);
        for ($i = 0; $i <= $k; $i++)
                $c[$i] = 0;
        for ($i = 0;$i < $n; $i++) {
                $c[$a[$i]]++;
        }
        $b = 0;
        for ($j = 0;$j <= $k; $j++) {
                for ($i = 0; $i < $c[$j]; $i++) {
                        $a[$b] = $j;
                        $b++;
                }
        }
} function heapSort(&$a) {
        $n = count($a);
        heapMake($a);
        while ($n > 0) {
                list($a[0], $a[$n - 1]) = array($a[$n - 1], $a[0]);
                $n--;
                heapify($a, 0, $n);
        }
} function heapMake(&$a) {
        $n = count($a);
        for ($i = ($n - 1); $i >= 0; $i--) {
                heapify($a, $i, $n);
        }
} function heapify(&$a, $pos, $n) {
        while (2 * $pos + 1 < $n) {
                $t = 2 * $pos +1;
                if (2 * $pos + 2 < $n && $a[2 * $pos + 2] >= $a[$t]) {
                        $t = 2 * $pos + 2;
                }
                if ($a[$pos] < $a[$t]) {
                        list($a[$pos], $a[$t]) = array($a[$t], $a[$pos]);
                        $pos = $t;
                }
                else break;
        }
} function batchTest(array $functions, $sizes, $testSize = 1) {
        $times = array();
        $files = array();
        foreach ($functions as $f) {
                $files[$f] = fopen('result_'.$f.(BIGINT ? 'big' : null).'.txt', 'w');
                foreach ($sizes as $s)
                        $times[$f][$s] = 0;
        }         foreach ($sizes as $arraySize) {
                echo 'Start '.$arraySize;
                for ($i = 0; $i < $testSize; $i ++) {
                        $a = fillArray($arraySize, BIGINT);
                        $expected = $a;
                        sort($expected);
                        foreach ($functions as $function) {
                                echo '.';
                                $array = $a;
                                $time = testAlgorithm($function, $array);
                                $times[$function][$arraySize] += $time;
                                if ($array != $expected) {
                                        echo $function." is wrong".EOL;
                                        if ($batchSize <= 10) {
                                                echo "expected: ";
                                                printArray($expected);
                                                echo "actual: ";
                                                printArray($array);
                                        }
                                }
                        }
                }                 foreach ($files as $function => $res) {
                        fwrite($res, $arraySize."\t".sprintf("%f", $times[$function][$arraySize] / $testSize).PHP_EOL);
                }
                echo 'done'.EOL;
        }         foreach ($files as $res) {
                fclose($res);
        }         // foreach ($times as $f => $times) {
        //      echo $f.EOL;
        //      echo "arraySize".T."time".EOL;
        //      if (file_exists($f.'.txt')) unlink($f.'.txt');
        //      foreach ($times as $arraySize => $time) {
        //              echo $arraySize.T.sprintf("%f", $time / $testSize).EOL;
        //              file_put_contents($f.'.txt', $arraySize.T.sprintf("%f", $time / $testSize).PHP_EOL, FILE_APPEND);
        //      }
        // }
} // runTests(array('shellSort'), 10000); function shellSort(&$a) {
        $n = count($a);
        $d = floor($n / 2);
        while ($d > 0) {
                for ($i = 0; $i < ($n - $d); $i++) {
                        $j = $i;
                        while ($j >= 0 && $a[$j] > $a[$j + $d]) {
                                list($a[$j], $a[$j + $d]) = array($a[$j + $d], $a[$j]);
                                $j--;
                        }
                }
                $d = floor($d / 2);
        }
} function insertSort(&$a) {
        $n = count($a);
        for ($i = 0; $i < ($n - 1); $i++) {
                $key = $i + 1;
                $tmp = $a[$key];
                for ($j = ($i + 1); $j > 0; $j--) {
                        if ($tmp < $a[$j - 1]) {
                                $a[$j] = $a[$j - 1];
                                $key = $j - 1;
                        }
                }
                $a[$key] = $tmp;
        }
} function selectionSort(&$a) {
        $n = count($a);
        for ($i = 0; $i < ($n - 1); $i++) {
                $key = $i;
                for ($j = ($i + 1); $j < $n; $j++) {
                        if ($a[$j] < $a[$key]) $key = $j;
                }
                if ($key != $i) {
                        list($a[$key], $a[$i]) = array($a[$i], $a[$key]);
                }
        }
} function mergeSort(&$a, $first = 0, $last = null) {
        if (is_null($last)) $last = count($a) - 1;
        $function = __FUNCTION__;
        if ($first < $last) {
                $function($a, $first, floor(($first + $last) / 2));
                $function($a, floor(($first + $last) / 2) + 1, $last);                 $tmp = array();                 $middle = floor(($first + $last) / 2);
                $start = $first;
                $final = $middle + 1;
                for ($i = $first; $i <= $last; $i++) {
                        if (($start <= $middle) && (($final > $last) || ($a[$start] < $a[$final]))) {
                                $tmp[$i] = $a[$start];
                                $start++;
                        } else {
                                $tmp[$i] = $a[$final];
                                $final++;
                        }
                }                 for ($i = $first; $i <= $last; $i++) {
                        $a[$i] = $tmp[$i];
                }
        }
} function quickSort(&$a, $l = 0, $r = 0) {
        if($r == 0) $r = count($a)-1;
        $i = $l;
        $j = $r;
        $x = $a[($l + $r) / 2];
        do {
                while ($a[$i] < $x) $i++;
                while ($a[$j] > $x) $j--;
                if ($i <= $j) {
                        if ($a[$i] > $a[$j])
                                list($a[$i], $a[$j]) = array($a[$j], $a[$i]);
                        $i++;
                        $j--;
                }
        } while ($i <= $j);
        $function = __FUNCTION__;
        if ($i < $r) $function($a, $i, $r);
        if ($j > $l) $function($a, $l, $j);
} function gnomeSort(&$a) {
        $n = count($a);
        $i = 1;
        $j = 2;
        while ($i < $n) {
                if ($a[$i - 1] < $a[$i]) {
                        $i = $j;
                        $j++;
                } else {
                        list($a[$i], $a[$i - 1]) = array($a[$i - 1], $a[$i]);
                        $i--;
                        if ($i == 0) {
                                $i = $j;
                                $j++;
                        }
                }
        }
} function oddEvenSort(&$a) {
        $n = count($a);
        $sorted = false;
        while (!$sorted) {
                $sorted = true;
                for ($i = 1; $i < ($n - 1); $i += 2) {
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                                if ($sorted) $sorted = false;
                        }
                }                 for ($i = 0; $i < ($n - 1); $i += 2) {
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                                if ($sorted) $sorted = false;
                        }
                }
        }
} function combSort(&$a) {
        $gap = $n = count($a);
        $swapped = true;
        while ($gap > 1 || $swapped) {
                if ($gap > 1) $gap = floor($gap / 1.24733);
                $i = 0;
                $swapped = false;
                while ($i + $gap < $n) {
                        if ($a[$i] > $a[$i + $gap]) {
                                list($a[$i], $a[$i + $gap]) = array($a[$i + $gap], $a[$i]);
                                if (!$swapped) $swapped = true;
                        }
                        $i++;
                }
        }
} function fakeSort(&$a) {} function cocktailSort(&$a) {
        $n = count($a);
        $left = 0;
        $right = $n - 1;
        do {
                //echo "# Left: ".$left." Right: ".$right.EOL;
                for ($i = $left; $i < $right; $i++) {
                        //echo "Comparation: ";
                        //printArray($a, array($i, $i + 1));
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                        }
                }
                $right -= 1;
                for ($i = $right; $i > $left; $i--) {
                        //echo "Comparation: ";
                        //printArray($a, array($i, $i - 1));
                        if ($a[$i] < $a[$i - 1]) {
                                //echo "Swap ";
                                list($a[$i], $a[$i - 1]) = array($a[$i - 1], $a[$i]);
                                //printArray($a, array($i, $i - 1), 'blue');
                        }
                }
                $left += 1;
        } while ($left <= $right);
} function runTests($functions, $arraySize = 100, $batchSize = 1) {
        $times = array('sort' => 0);
        foreach ($functions as $f) $times[$f] = 0;         for ($i = 0; $i < $batchSize; $i ++) {
                echo "Iteration #".$i.EOL;
                $a = fillArray($arraySize);
                $expected = $a;
                // sort($expected);
                $times['sort'] += testAlgorithm('sort', $expected);
                foreach ($functions as $function) {
                        $array = $a;
                        $time = testAlgorithm($function, $array);
                        echo "+".$time.EOL;
                        $times[$function] += $time;
                        if ($array != $expected) {
                                echo $function." is wrong".EOL;
                                if ($batchSize <= 10) {
                                        echo "expected: ";
                                        printArray($expected);
                                        echo "actual: ";
                                        printArray($array);
                                }
                        }
                }
        }         asort($times);
        foreach ($times as $function => $time) {
                echo "time ".$function."(x".$batchSize.")".T.round($times[$function] / $batchSize, 3).T.round($times[$function], 3).EOL;
        }         echo "Total time".T.T.round(array_sum($times), 3).EOL;
        //echo "Average time: ".round($times / $batchSize, 3).EOL;
}
function testAlgorithm($function, &$a) {
        $st = microtime(true);
        //call_user_func($function, $a);
        $function($a);
        $en = microtime(true) - $st;
        return $en;
}
function fillArray($s, $isBigInt = false) {
        $limit = $s;
        if ($isBigInt) {
                $limit = PHP_INT_MAX;
        }
        $a = array();
        for ($i=0; $i<$s;$i++) {
                $a[] = rand(1, $limit);
        }
        return $a;
}
function printArray($a, $keys = null, $color = 'red') {
        if (!is_null($keys)) foreach ($keys as $k) $a[$k] = "<span style='color: ".$color."'>".$a[$k]."</span>";
        echo '[';
        echo implode(', ', $a);
        echo ']'.EOL;
} function bubbleSort(&$a) {
        $n = count($a);
        // bubble sorting
        for ($j = 0; $j < ($n - 1); $j++) {
                //echo "Iteration #".$j.EOL;
                for ($i = 0; $i < ($n - $j - 1); $i++) {
                        //echo T.'#'.$i.T.'v'.$a[$i].EOL;
                        //echo "Comparation: ";
                        //printArray($a, array($i, $i + 1));
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap: ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                        }
                }
        }
} function bubbleSortWithFlag(&$a) {
        $n = count($a);
        // bubble sorting
        for ($j = 0; $j < ($n - 1); $j++) {
                //echo "Iteration #".$j.EOL;
                $flag = false;
                for ($i = 0; $i < ($n - $j - 1); $i++) {
                        //echo T.'#'.$i.T.'v'.$a[$i].EOL;
                        //echo "Comparation: ";
                        //printArray($a, array($i, $i + 1));
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap: ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                                if (!$flag) $flag = true;
                        }
                }
                if (!$flag) break;
        }
} function combinedBubbleSort(&$a) {
        $n = count($a);
        // bubble sorting
        for ($j = 0; $j < ($n - 1); $j++) {
                //echo "Iteration #".$j.EOL;
                $flag = false;
                $min = $j;
                for ($i = $j; $i < ($n - $j - 1); $i++) {
                        //echo T.'#'.$i.T.'v'.$a[$i].EOL;
                        //echo "Comparation: ";
                        //printArray($a, array($i, $i + 1));
                        if ($a[$i] > $a[$i + 1]) {
                                //echo "Swap: ";
                                list($a[$i], $a[$i + 1]) = array($a[$i + 1], $a[$i]);
                                //printArray($a, array($i, $i + 1), 'blue');
                                if (!$flag) $flag = true;
                        }
                        if ($a[$i] < $a[$min]) $min = $i;
                }
                if (!$flag) break;
                if ($min != $j) {
                        //echo "Swap: ";
                        list($a[$min], $a[$j]) = array($a[$j], $a[$min]);
                        //printArray($a, array($min, $j), 'yellow');
                }
        }
} function stupidSort(&$a) {
        $n = count($a);
        for ($i = 1; $i < $n; $i ++) {
        //echo "Iteration #".$i.EOL;
                if ($a[$i] < $a[$i - 1]) {
                        //echo "Swap :";
                        list($a[$i], $a[$i - 1]) = array($a[$i - 1], $a[$i]);
                        //printArray($a, array($i, $i - 1));
                        $i = 0;
                        continue;
                }
        }
}

php中14中排序方式的实现的更多相关文章

  1. 使用jdk中提供的排序方式

    package com.bjpowernode.t01; import java.util.Arrays; /** * 使用jdk中提供的排序方式 * */public class TestArray ...

  2. Java中常见的排序方式-选择排序(升序)

    [基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[0]和a ...

  3. Java中常见的排序方式-快速排序(升序)

    [基本思想] 快速排序在元素较多的情况下,排序效率是相当高的.其基本思想是这样: 假设数组为int[] arr = { 49, 38, 65, 97, 76, 13, 27, 22, 26, 41, ...

  4. Java中常见的排序方式-冒泡排序(升序)

    [基本思想] 假设数组为int[] a = { 49, 38, 65, 97, 76, 13, 27 },数组元素个数为7个. 第1轮比较:先是a[0]与a[1]比较,大于则先交换,再比较a[1]和a ...

  5. C#中Dictionary<TKey,TValue>排序方式

    自定义类: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Sy ...

  6. Access中的自定义排序设置方式

    一.问题起因 最近有网友提问说,Access中在用查询指定排序方式时,为什么只有升序跟降序,怎么米有自定义排序了?竟然比Excel都弱啊! 其实这是对Access的误解,我这就给大家来解一下疑惑.案例 ...

  7. discuz 修改亮剑积分商城2.91模板(在常用设置中添加商场首页排序方式的背景颜色)

    在应用 -> 积分商城 -> 常用设置 中添加 商场首页排序方式 的背景颜色修改功能 步骤: 1.找到并打开此页面对应的模板source\plugin\aljsc\template\set ...

  8. C#中Dictionary排序方式

    转载自:https://www.cnblogs.com/5696-an/p/5625142.html 自定义类: https://files.cnblogs.com/files/xunhanliu/d ...

  9. OBjective-C:在可变数组NSMutableArray中添加相同对象后,进行自定义的排序方式输出

    以下为自定义的排序方式的实现 #import "Person+Compare.h" @implementation Person (Compare) -(NSComparisonR ...

随机推荐

  1. Zookeeper简介与集群搭建【转】

    Zookeeper简介 Zookeeper是一个高效的分布式协调服务,可以提供配置信息管理.命名.分布式同步.集群管理.数据库切换等服务.它不适合用来存储大量信息,可以用来存储一些配置.发布与订阅等少 ...

  2. centos6中创建软raid方法

    raid概述: 组建raid阵列命令: mdadm:模式化的工具 /etc/mdadm.conf     -A  Assemble 装配模式     -C  Create 创建模式     -C:专用 ...

  3. PL/SQL第四章 where子语句

    -- 学习where语句 -- 1.学会where子句中使用常规比较符 -- 常规比较操作符:=,<>(不等于),!=,>=,<=,>,< -- 当区分大小写时,可 ...

  4. ThinkPHP 框架2.1,2.2和3.0版本开启lite模式导致URL命令执行漏洞

    在开启了Lite模式后,在ThinkPHP/extend/Mode/Lite/Dispatcher.class.php中第73行: // 解析剩余的URL参数 $res = preg_replace( ...

  5. javascript 练习题目答案

    //廖雪峰的博客的这个教程的答案//https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb300 ...

  6. Oracle 数据库逻辑结构

    注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. Oracle 数据库逻辑结构 一.存储关系 Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据 ...

  7. js闭包实例汇总

    本文是通过实例来帮助大家深刻理解js闭包,是篇非常不错的文章,这里推荐给大家,有需要的小伙伴可以参考下 Js闭包 闭包前要了解的知识 1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取 ...

  8. 基于vue的UI框架集锦

    前端框架百花齐放.争奇斗艳,令人眼花缭乱.大神们一言不合就整一个框架出来,另小白们无所适从.下面罗列了一些比较优秀的UI框架,Star多的大都是老牌劲旅,Star少的许多是后起之秀. (1)Eleme ...

  9. HTTP协议 (1)

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议. HTT ...

  10. PHP 获取时间

    1.获取系统当前时间 echo "date('Y-m-d',time())"; 2.获取系统前一天时间 echo "date("Y-m-d",strt ...