Exemple #1
0
function qsort(array &$ary, $left, $right)
{
    if ($left >= $right) {
        return;
    }
    $pivot = $ary[($left + $right) / 2];
    //基準点
    $l = $left;
    $r = $right;
    $temp = null;
    //入れ替え用
    while ($l <= $r) {
        while ($ary[$l] < $pivot) {
            $l++;
        }
        while ($ary[$r] > $pivot) {
            $r--;
        }
        if ($l <= $r) {
            // 入れ替え処理(left <=> right)
            $temp = $ary[$l];
            $ary[$l] = $ary[$r];
            $ary[$r] = $temp;
            $l++;
            $r--;
        }
    }
    echo implode(",", $ary) . PHP_EOL;
    qsort($ary, $left, $r);
    qsort($ary, $l, $right);
}
Exemple #2
0
function qsort(&$nums, $left, $right)
{
    if ($left >= $right) {
        return;
    }
    $l = $left;
    $r = $right;
    $p = $nums[($left + $right) / 2];
    //center pivot
    $tmp = 0;
    while ($l <= $r) {
        while ($nums[$l] < $p) {
            $l++;
        }
        while ($nums[$r] > $p) {
            $r--;
        }
        if ($l <= $r) {
            // replace left num <=> right num
            $tmp = $nums[$l];
            $nums[$l] = $nums[$r];
            $nums[$r] = $tmp;
            $l++;
            $r--;
            echo implode(",", $nums) . PHP_EOL;
        }
    }
    qsort($nums, $left, $r);
    qsort($nums, $l, $right);
}
Exemple #3
0
function qsort(&$array, $low, $high)
{
    if ($high <= $low) {
        return;
    }
    $j = partion($array, $low, $high);
    qsort($array, $low, $j - 1);
    qsort($array, $j + 1, $high);
}
Exemple #4
0
function qsort(array $xs)
{
    // [3 => 1] -> [0 => 1]
    $xs = array_values($xs);
    if (false === array_key_exists(1, $xs)) {
        return $xs;
    }
    $pivot = $xs[0];
    $xss = array_slice($xs, 1);
    $left = array_filter($xss, function ($x) use($pivot) {
        return $x < $pivot;
    });
    $right = array_filter($xss, function ($x) use($pivot) {
        return $x >= $pivot;
    });
    return array_merge(qsort($left), [$pivot], qsort($right));
}
Exemple #5
0
function qsort(array &$nums, $left, $right, $order = asc)
{
    if ($left >= $right) {
        return;
    }
    $pivo = $nums[($left + $right) / 2];
    $l = $left;
    $r = $right;
    $tmp = 0;
    while ($l <= $r) {
        if ($order == "asc") {
            while ($nums[$l] < $pivo) {
                $l++;
            }
            while ($nums[$r] > $pivo) {
                $r--;
            }
        } else {
            while ($nums[$l] > $pivo) {
                $l++;
            }
            while ($nums[$r] < $pivo) {
                $r--;
            }
        }
        if ($l <= $r) {
            $tmp = $nums[$l];
            $nums[$l] = $nums[$r];
            $nums[$r] = $tmp;
            $l++;
            $r--;
        }
        echo implode(",", $nums) . PHP_EOL;
    }
    qsort($nums, $left, $r, $order);
    qsort($nums, $l, $right, $order);
}
Exemple #6
0
 /**
  * CSVデータを読み込む
  *
  * @param array $queryData
  * @return mixed array / false result
  * @access public
  */
 function readCsv($queryData)
 {
     $queryData = am($queryData, array('option' => ''));
     if (preg_match("/^COUNT\\(\\*\\)\\sAS\\scount\$/s", trim($queryData['fields'][0]))) {
         /* COUNTフィールドの確認 */
         $queryData['fields'] = null;
         $queryData['option'] = 'count';
     } elseif (preg_match("/^MAX\\((.+?)\\)\\sAS\\s(.*?)\$/s", trim($queryData['fields'][0]), $matches)) {
         /* MAXフィールドの確認(1フィールドのみ対応) */
         $queryData['fields'] = null;
         $maxField = $matches[1];
         $maxAsField = $matches[2];
         $queryData['option'] = 'max';
     }
     /* CSVファイルを配列として読み込む */
     // TODO ここでは、全データを読み込む仕様となっているので大量のデータを扱う場合、メモリに負荷がかかってしまう。
     // 並び替えを実行した上で、指定件数を取り出すという要件を実現する為、こういう仕様となっている。
     // 何か解決策があれば・・・
     if (empty($queryData['conditions'])) {
         $queryData['conditions'] = null;
     }
     $records = $this->_readCsvFile($queryData['tableName'], $queryData['conditions']);
     /* ソート処理(1フィールドのみ対応) */
     if (!empty($queryData['order'][0])) {
         list($sortField, $direct) = split(" ", $queryData['order'][0]);
         qsort($records, 0, count($records) - 1, $sortField, strtoupper($direct));
     }
     /* ページ指定がある場合は、取得開始件数を計算 */
     if ($queryData['page']) {
         $begin = ($queryData['page'] - 1) * $queryData['limit'] + 1;
     }
     /* データのフィルタリング */
     $count = 0;
     $matchCount = 0;
     $maxValue = 0;
     if ($records) {
         foreach ($records as $record) {
             $matchCount++;
             if (isset($begin) && $matchCount < $begin) {
                 continue;
             }
             if ($queryData['option'] == 'max') {
                 if ($record[$maxField] > $maxValue) {
                     $maxValue = $record[$maxField];
                 }
                 continue;
             }
             // フィールド指定がある場合は指定されたフィールドのみ取得
             if ($queryData['fields']) {
                 foreach ($queryData['fields'] as $field) {
                     if (!empty($record[$field])) {
                         $result[$field] = $record[$field];
                     } else {
                         $result[$field] = '';
                     }
                 }
                 $results[] = $result;
             } else {
                 $results[] = $record;
             }
             $count++;
             // 件数制限がある場合は、件数を超えた時点で抜ける
             if ($queryData['limit'] && $count >= $queryData['limit']) {
                 break;
             }
         }
     }
     $this->_count = $count;
     // カウントオプションの場合は件数を返す
     if (!empty($queryData['option']) && $queryData['option'] == 'count') {
         return array(0 => array('count' => $this->_count));
     }
     // MAXオプションの場合は指定フィールドの最大値を返す
     if (!empty($queryData['option']) && $queryData['option'] == 'max') {
         return array(0 => array($maxAsField => $maxValue));
     }
     if (!empty($queryData["className"])) {
         $this->__resultModelName = $queryData["className"];
     }
     if (isset($results)) {
         return $results;
     } else {
         return array();
     }
 }
function qsort(&$int_array, $left, $right, $sortField)
{
    if ($left >= $right) {
        return;
    }
    swap($int_array, $left, intval(($left + $right) / 2));
    $last = $left;
    for ($i = $left + 1; $i <= $right; $i++) {
        if ($int_array[$i][$sortField] > $int_array[$left][$sortField]) {
            swap($int_array, ++$last, $i);
        }
    }
    swap($int_array, $left, $last);
    qsort($int_array, $left, $last - 1, $sortField);
    qsort($int_array, $last + 1, $right, $sortField);
}
Exemple #8
0
<?php

$a = [2, 5, 4, 6, 1, 7, 3, 8, 9, 0];
qsort($a);
function qsort(&$array)
{
    $left = 0;
    $right = count($array) - 1;
    my_sort($array, $left, $right);
}
function my_sort(&$array, $left, $right)
{
    $l = $left;
    $r = $right;
    $center = $array[(int) ($left + $right) / 2];
    do {
        while ($array[$r] > $center) {
            $r--;
        }
        while ($array[$l] < $center) {
            $l++;
        }
        if ($l <= $r) {
            list($array[$r], $array[$l]) = array($array[$l], $array[$r]);
            $l++;
            $r--;
        }
    } while ($l <= $r);
    if ($r > $left) {
        my_sort($array, $left, $r);
    }