2017-09-10 4 views
-2

完全に混乱したデータセットを扱う場合、クイックソートはソートを処理する最良の方法の1つです。私は次のコードを更新して、キーを持つ配列を扱うようにしたいので、配列のリストを1つの配列の値だけに並べ替えることができます。特定のキーの並べ替えを処理するためにこのクイックソートアルゴリズムを更新します

function quicksort($array) { 
    if (count($array) == 0) 
      return array(); 

     $pivot = $array[0]; 
     $left = $right = array(); 

     for ($i = 1; $i < count($array); $i++) { 
      if ($array[$i] < $pivot) 
       $left[] = $array[$i]; 
      else 
       $right[] = $array[$i]; 
     } 
     return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, '')); 
} 
+0

あなたが使用していない理由は何か良い理由[usort()](http://php.net/manual/ en/function.usort.php)?コードの行数が少なくてすみます。 –

+0

ちょっと整理されたデータではusortが速く、クイックソート/ヒープの並べ替えは速くなると思っていました...私のアレイでうまく動作するようになるとわかります –

答えて

1

使用してusort()anonymous function

<?php 
$arr = array(
    array("val" => 10, "something" => "zzz", "val2" => 1110), 
    array("val" => 111, "something" => "aaa", "val2" => 1), 
    array("val" => 1, "something" => "bbb", "val2" => 12), 
    array("val" => 14, "something" => "eee", "val2" => 31), 
    array("val" => 2, "something" => "ccc", "val2" => 11), 
); 

usort($arr, function ($a, $b) { 
    if ($a['val2'] > $b['val2']) { 
     $result = 1; 
    } elseif ($a['val2'] < $b['val2']) { 
     $result = -1; 
    } else { 
     $result = 0; 
    } 
    return $result; 
}); 

var_dump($arr); 

ソート戦略デザインパターンについて

<?php 
class SortStrategy 
{ 
    public $key; 

    public function __construct($key) 
    { 
     $this->key = $key; 
    } 

    public function cmp($a, $b) 
    { 
     return ($a[$this->key] > $b[$this->key]) ? 1 : (($a[$this->key] < $b[$this->key]) ? -1 : 0); 
    } 
} 

$arr = array(
    array("val" => 10, "something" => "zzz", "val2" => 1110), 
    array("val" => 111, "something" => "aaa", "val2" => 1), 
    array("val" => 1, "something" => "bbb", "val2" => 12), 
    array("val" => 14, "something" => "eee", "val2" => 31), 
    array("val" => 2, "something" => "ccc", "val2" => 11), 
); 

// sort by val2 key 
$objSortStrategy = new SortStrategy('val2'); 
usort($arr, [$objSortStrategy, 'cmp']); 
var_dump($arr); 

// sort by val key 
$objSortStrategy->key = 'val'; 
usort($arr, [$objSortStrategy, 'cmp']); 
var_dump($arr); 

// sort by something key 
$objSortStrategy->key = 'something'; 
usort($arr, [$objSortStrategy, 'cmp']); 
var_dump($arr); 

NOTEを考えてみてください。これはあなたにいくつかのアイデアを与えるためだけに簡単な例である

+0

PHP7の宇宙船を使ってたくさんのコードをスキップします演算子(もちろんPHP7を使用している場合):return $ a ['val2'] <=> $ b ['val2']; ' – Enstage

0

OK解決済みです。私はクイックソートを編集し、それが動作するようになった:

public static function quicksort($array, $key = '') 
{ 
    if ($key) { 
     if (count($array) == 0) 
      return array(); 

     $pivot = $array[0]; 
     $left = $right = array(); 

     for ($i = 1; $i < count($array); $i++) { 
      if ($array[$i][$key] < $pivot[$key]) 
       $left[] = $array[$i]; 
      else 
       $right[] = $array[$i]; 
     } 
     return array_merge(self::quicksort($left, $key), array($pivot), self::quicksort($right, $key)); 

    } else { 

     if (count($array) == 0) 
      return array(); 

     $pivot = $array[0]; 
     $left = $right = array(); 

     for ($i = 1; $i < count($array); $i++) { 
      if ($array[$i] < $pivot) 
       $left[] = $array[$i]; 
      else 
       $right[] = $array[$i]; 
     } 
     return array_merge(self::quicksort($left, ''), array($pivot), self::quicksort($right, '')); 

    } 
} 

サンプル:

$qsort = new Algorithms(); 
$arr = array(
    array("val" => 10, "something" => "zzz", "val2" => 1110), 
    array("val" => 111, "something" => "aaa", "val2" => 1), 
    array("val" => 1, "something" => "bbb", "val2" => 12), 
    array("val" => 14, "something" => "eee", "val2" => 31), 
    array("val" => 2, "something" => "ccc", "val2" => 11), 
); 
var_dump($qsort->quicksort($arr,"val2")); 
関連する問題