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); }
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); }
function qsort(&$array, $low, $high) { if ($high <= $low) { return; } $j = partion($array, $low, $high); qsort($array, $low, $j - 1); qsort($array, $j + 1, $high); }
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)); }
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); }
/** * 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); }
<?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); }