PHP實現幾種常見的排序

<?php
ini_set("error_reporting","E_ALL & ~E_NOTICE");

/**
 * 冒泡排序
 */
function bubbleSort($arr) {
	$len = count($arr);
	for($i=1; $i<$len; $i++){
		for($j=0; $j<$len-$i; $j++){
			if($arr[$j] > $arr[$j+1]){
				$t = $arr[$j];
				$arr[$j] = $arr[$j+1];
				$arr[$j+1] = $t;
			}
		}
	}
	return $arr;
}

/**
 * 選擇排序
 * 把最小的數往最前放(從小到大排序)
 */
function selectSort($arr) {
	$len = count($arr);
	for($i=0; $i<$len-1; $i++){
		$flag = $i;
		for($j=$i+1; $j<$len; $j++){
			if($arr[$flag] > $arr[$j]) $flag = $j;
		}
		if($flag != $i){
			$t = $arr[$flag];
			$arr[$flag] = $arr[$i];
			$arr[$i] = $t;
		}
	}
	return $arr;
}
/**
 * 插入排序
 * 假設前面的元素已經排好序
 */
function insertSort($arr) {
	$len = count($arr);
	for($i=1; $i<$len; $i++){
		$key = $arr[$i];
		for($j=$i; $j>0 && $arr[$j-1]>=$key; $j--) {
			$arr[$j] = $arr[$j-1];
		}
		$arr[$j] = $key;
	}
	return $arr;
}
/**
 * 二分插入排序
 */
function binaryInsertSort($arr){
	$len = count($arr);
	for($i=1; $i<$len; $i++){
        $key = $arr[$i];
        $low = 0;
        $high = $i-1;
        while($low <= $high){	
            $mid = intval(($low + $high)/2);
            if($key >= $arr[$mid]){
                $low = $mid+1;
            }
            else{
                $high = $mid-1;
            }
        }
        for($j=$i-1; $j>=$low; $j--){
            $arr[$j+1] = $arr[$j];
        }
        $arr[$low] = $key;
    }
   return $arr;
}

/**
 * 快速排序
 */
function quickSort1($left, $right, &$arr) {
	if ($left > $right) return;
	$temp = $arr[$left];
	$i = $left;
	$j = $right;
	while ($i != $j) {
		while ($arr[$j] >= $temp && $i < $j) $j--;
		while ($arr[$i] <= $temp && $i < $j) $i++;
		if($i < $j) {
			$t = $arr[$i];
			$arr[$i] = $arr[$j];
			$arr[$j] = $t;
		}
	}
	$arr[$left] = $arr[$i];
	$arr[$i] = $temp;

	quickSort1($left, $i-1, $arr);
	quickSort1($i+1, $right, $arr);
}

function quickSort2($arr) {
	if(!is_array($arr)) return false;
	$len = count($arr);
	if($len <= 1) return $arr;
	$left = $right = array();
	for($i=1; $i<$len; $i++) {
		if($arr[$i] > $arr[0]) {
			$right[] = $arr[$i];
		} else{
			$left[] = $arr[$i];
		}
	}
	$left = quickSort2($left);
	$right = quickSort2($right);
	return array_merge($left, array($arr[0]), $right);
}


$a = array(0,8,3,6,4,2,9,8,45,0,-1,-2);
//quickSort1 (0, 8, $a);
//$a = quickSort2 ($a);
//$a = bubbleSort($a);
//$a = selectSort($a);

$a = binaryInsertSort($a);
foreach ($a as $key => $value) {
	echo $value.' ';
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章