[PHP] 排序 php从N个数中找出最大的10个数代码 →→→→→进入此内容的聊天室

来自 , 2020-05-09, 写在 PHP, 查看 114 次.
URL http://www.code666.cn/view/019f8b94
  1. <?php
  2. define('DEBUG',                 FALSE);
  3. define('INFO',                  TRUE);
  4. $stderr = fopen('php://stderr', 'w+');
  5. $stdout = fopen('php://stdout', 'w+');
  6. $stdin  = fopen('php://stdin', 'r+');
  7.  
  8. class PQueue {
  9.     public  $data;
  10.     public  $next   = NULL;
  11.     public function __construct($data) {
  12.         $this->data = $data;
  13.     }
  14.     public static function factory($data, $n) {
  15.         $i      = -1;
  16.         $head   = NULL;
  17.         $prev   = NULL;
  18.         while ( ++ $i < $n ) {
  19.             $node   = new PQueue($data);
  20.             if ( is_null($head) )
  21.                 $head       = $node;
  22.             if ( !is_null($prev) )
  23.                 $prev->next = $node;
  24.             $prev   = $node;
  25.         }
  26.         return $head;
  27.     }
  28.     public static function dump($node, $n) {
  29.         global  $stderr, $stdout;
  30.         while ( !is_null($node) ) {
  31.             fprintf($n ? $stderr : $stdout, "%d\n", $node->data);
  32.             $node   = $node->next;
  33.         }
  34.         if ( $n ) fprintf($n ? $stderr : $stdout, "\n");
  35.     }
  36. }
  37.  
  38. function generate_test_data($n) {
  39.     global  $stderr, $stdout;
  40.     srand(time());
  41.     for ( $i = 0; $i < $n; $i ++ ) {
  42.         $r  = rand(0, 2147483647);
  43.         fprintf($stdout, "%d\n", $r);
  44.         fprintf($stderr, "%s", pack('l', $r));
  45.     }
  46. }
  47.  
  48. function main($argc, $argv) {
  49.     global  $stderr, $stdout, $stdin;
  50.     if ( $argc < 2 ) {
  51.         printf("usage: \n\t1. 生成测试数据: %s <number> /* 标准错误以二进制方式输出测试数据, 标准输出以文本方式输出测试数据用于脚本校验 */\n\t2. 执行Top 10查找: %s <exec> /* 标准输出输出前10个最大数据(倒序), 开启INFO时在标准错误输出统计信息, 开启DEBUG时在标准错误输出调试信息\n",
  52.                     $argv[0], $argv[0]);
  53.         exit(0);
  54.     }
  55.     if ( strcmp($argv[1], "exec") != 0 ) {
  56.         /* 不考虑数字输入的容错了 */
  57.         generate_test_data($argv[1]);
  58.         exit(0);
  59.     }
  60.  
  61.     $sbuff  = NULL;
  62.     $rbuff  = PQueue::factory(-1, 10);
  63.  
  64. if ( DEBUG ) {
  65.     PQueue::dump($rbuff, 1);
  66. }
  67. if ( INFO ) {
  68.     $s_0    = 0;
  69.     $s_1    = 0;
  70.     $s_2    = 0;
  71.     $begin  = microtime(TRUE);
  72. }
  73.     while ( FALSE != ($sbuff = fread($stdin, 1024 * 1024 * 4)) ) {
  74.         $sbuff  = unpack('l*', $sbuff);
  75. if ( INFO ) {
  76.     $s_2    += count($sbuff);
  77. }
  78.         foreach ( $sbuff as $d ) {
  79. if ( INFO ) {
  80.     $s_0 ++;
  81. }
  82. if ( DEBUG )
  83.     fprintf($stderr, "processing %d\n", $d);
  84.             $tmp    = &$rbuff;
  85.             while ( $tmp != NULL && $d >= $tmp->data ) {
  86.                 $tmp    = &$tmp->next;
  87. if ( INFO ) {
  88.     $s_0 += 2;
  89. }
  90.             }
  91. if ( INFO ) {
  92.     $s_0 ++;
  93. }
  94.             if ( $tmp === $rbuff )
  95.                 continue;
  96. if ( DEBUG )
  97.     fprintf($stderr, "tmp %d, rbuff %d\n", is_null($tmp) ? -1 : $tmp->data, $rbuff->data);
  98. if ( INFO ) {
  99.     $s_0 ++;
  100.     $s_1 ++;
  101. }
  102.             $rbuff->data    = $d;
  103.             if ( $tmp != $rbuff->next ) {
  104.                 $t          = $rbuff;
  105.                 $rbuff      = $rbuff->next;
  106.                 $t->next    = is_null($tmp) ? NULL : $tmp;
  107.                 $tmp        = $t;
  108. if ( INFO ) {
  109.     $s_1 += 4;
  110.     $s_0 ++;
  111. }
  112.             }
  113.         }
  114. if ( DEBUG )
  115.     PQueue::dump($rbuff, 1);
  116.     }
  117. if ( INFO ) {
  118.     $end    = microtime(TRUE);
  119. }
  120.     PQueue::dump($rbuff, 0);
  121. if ( INFO ) {
  122.     fprintf($stderr, "总计[%d]个输入\n总计比较[%d]次\n总计写内存[%d]次\n总计耗时[%0.6fs]\n",
  123.         $s_2, $s_0, $s_1, $end - $begin);
  124. }
  125. }
  126. main($argc, $argv);
  127.  
  128.  

回复 "排序 php从N个数中找出最大的10个数代码"

这儿你可以回复上面这条便签

captcha