2013-07-21 5 views
5

SplFixedArrayクラスのインスタンスで整数または文字列をソートする方法はありますか? PHPのarrayに変換し、ソートしてから唯一のオプションに変換していますか?SplFixedArrayをソートする方法は?

+2

はい。 PHPのネイティブソート関数は、オブジェクト配列では機能しません。回避策や手動によるコーディングが必要です:http://phppowercoding.com/the-speed-issue-orternately-why-a-php-implemented-quicksorts-not-so-quick/397 – mario

答えて

3

まず、SplFixedArraysを見つけて使用していただきありがとうございます。私は彼らがバニラのPHPで非常に活用されていない機能だと思う...

あなたはおそらく評価されているように、彼らのパフォーマンスは(通常のPHP配列に比べて)比類ない - しかし、これはいくつかのトレードオフ、それらを並べ替えるPHP関数の欠如を含む(これは残念です)!

バブルソートの実装は、比較的簡単で効率的なソリューションです。各要素の連続したペアを見て、最も高いものを右側に置くだけで、繰り返し実行できます。アレイがソートされるまでリンスし、繰り返します。

<?php 
$arr = new SplFixedArray(10); 
$arr[0] = 2345; 
$arr[1] = 314; 
$arr[2] = 3666; 
$arr[3] = 93; 
$arr[4] = 7542; 
$arr[5] = 4253; 
$arr[6] = 2343; 
$arr[7] = 32; 
$arr[8] = 6324; 
$arr[9] = 1; 

$moved = 0; 
while ($moved < sizeof($arr) - 1) { 
    $i = 0; 
    while ($i < sizeof($arr) - 1 - $moved) { 
     if ($arr[$i] > $arr[$i + 1]) { 
      $tmp = $arr[$i + 1]; 
      $arr[$i + 1] = $arr[$i]; 
      $arr[$i] = $tmp; 
     } 
     $i++; 

     var_dump ($arr); 
    } 
    $moved++; 
} 

これは高速ではありません。効率的ではありません。 Quicksortについては、wikibooks.orgにこれを含めてオンラインで文書化されている例があります(SplFixedArraysを使用するための修正が必要です)。

本当にあなたの質問を解決することを超えて、私は本当にSplFixedArrayのようなものが存在し、「array_sort()への迅速な呼び出し」の後ろで何が起こっているのか理解するように強要していると感じています実行する時間)はプログラマーとプログラマーの違いになります。私はあなたの質問に拍手喝采!

+0

ブラインドでバブルソートを使用する'SplFixedArray'のためには、固定配列をそれ自身として使うことのメリットをすべて排除する考え方があるかもしれません。 PHPが単独でどれくらい多くのケース(https://github.com/php/php-src/blob/250938e2d35fc54161a18167b7901c5e3b574371/Zend/zend_sort.c)を調べているのでしょうか(よく、7.xブランチにあります)。 – mente

+0

私はSplFixedArrayでクイックソートを一度実装して、パフォーマンスのヒットを調べました。私はアルゴリズムを最適化するために最善を尽くしたが、PHP自体のオーバーヘッドのせいで実験全体が短くなった。 – Flosculus

+0

@Flosculus - あなたはここにコードを投稿しても構わないと思いますか?私は本当にあなたがしたことを見て、あなたのパフォーマンスの結果を見ることに興味があります。 – wally

2

ここでは、splFixedArraysを使用したバブルソートの私の適応です。 PHP 7では、このシンプルなプログラムは普通のバブルトートの2倍の速さです。

function bubbleSort(SplFixedArray $a) 
{ 
    $len = $a->getSize() - 1; 
    $sorted = false; 

    while (!$sorted) { 
    $sorted = true; 
    for ($i = 0; $i < $len; $i++) 
    { 
     $current = $a->offsetGet($i); 
     $next = $a->offsetGet($i + 1); 

     if ($next < $current) { 
      $a->offsetSet($i, $next); 
      $a->offsetSet($i + 1, $current); 
      $sorted = false; 
     } 
    } 
    } 

    return $a 
} 

$starttime = microtime(true); 
$array = SplFixedArray::fromArray([3,4,1,3,5,1,92,2,4124,424,52,12]); 
$array = bubbleSort($array); 

print_r($array->toArray()); 
echo (microtime(true) - $starttime) * 1000, PHP_EOL; 
関連する問題