plasmasphere.net -プラズマスフィア ドットネット-

Diary

PHPでクイックソート

2006/10/06(Fri) 00:10

昨日のバブルソートに続き、クイックソート(Quick Sort)のソースも置いておきます。
PHPのソートソースって、探しても見つからないんですよね。なんでだろ。

qsort.php

<?php

$val = array(12,50,20,1574,67,54,2,35,21);

echo "ソート前";
echo "<pre>";
print_r($val);
echo "</pre>";

qsort($val, 0, count($val)-1);

echo "ソート後";
echo "<pre>";
print_r($val);
echo "</pre>\n<hr />\n";


$arr = array(
			"0" => array( "name" => "名前1", "No" => "3", "value" => "******"),
			"1" => array( "name" => "名前2", "No" => "1", "value" => "******"),
			"2" => array( "name" => "名前3", "No" => "2", "value" => "******"),
			"3" => array( "name" => "名前4", "No" => "5", "value" => "******"),
			"4" => array( "name" => "名前5", "No" => "4", "value" => "******"),
		);

echo "ソート前";
echo "<pre>";
print_r($arr);
echo "</pre>";

qsort($arr, 0, count($val)-1, $flag = "No");

echo "ソート後";
echo "<pre>";
print_r($arr);
echo "</pre>\n<hr />";

/*
 * クイックソート
 * $int_array = ソートする配列
 * $left = 開始位置(0で決め打ち)
 * $right = 終了位置($int_arrayの要素数:決め打ち)
 * $flag = ソート対象の配列要素
 * $order = ソートの昇順(ASC)・降順(DESC) デフォルトは昇順
*/
function swap(&$v, $i, $j) {
	$temp = $v[$i];
	$v[$i] = $v[$j];
	$v[$j] = $temp;
}

function qsort(&$int_array, $left = 0, $right, $flag = "", $order = "ASC") {
	if ($left >= $right) {
		return;
	}
	swap ($int_array, $left, intval(($left+$right)/2));
	$last = $left;
	for ($i = $left + 1; $i <= $right; $i++) {
		if($flag) {
			if($order=="DESC") {
				if ($int_array[$i]["".$flag.""] > $int_array[$left]["".$flag.""]) {
					swap($int_array, ++$last, $i);
				}
			} else {
				if ($int_array[$i]["".$flag.""] < $int_array[$left]["".$flag.""]) {
					swap($int_array, ++$last, $i);
				}
			}
		} else {
			if($order=="DESC") {
				if ($int_array[$i] > $int_array[$left]) {
					swap($int_array, ++$last, $i);
				}
			} else {
				if ($int_array[$i] < $int_array[$left]) {
					swap($int_array, ++$last, $i);
				}
			}
		}
	}
	swap($int_array, $left, $last);
	qsort($int_array, $left, $last-1, $flag = $flag, $order = $order);
	qsort($int_array, $last+1, $right, $flag = $flag, $order = $order);
}
?>

まぁ、落ちてたソースを多次元配列に対応させただけですけどね。
とりあえず関数であっても邪魔にはならないので、最近作るWebには大体入れてます。

参考:いろいろなソートアルゴリズム


似てるっぽいネタ


 
© 1999- plasmasphere.net All rights reserved.