php 實現快速排序算法 PHP 無序數組求中位數

php 實現快速排序算法:

第一種:

1. 選取第一個元素爲基數,分別從右(high)往左(high--)查找,找到一個比基數小的數,進行位置交換, 直到 low == high,結束一次排序;然後從 左 往右查找,找到一個比基數大的數,進行位置交換,直到 low == high,結束一次排序;最後將基數 放到 low 位置上。

2. 此時的 low 值代表一次排序後 基數所在的數組下標位置。

3. 通過遞歸進行 左右子數組排序,直到 low == high

代碼如下:

$arr = [49,38,65,97,76,13,27,49];
function partition(&$arr, $low, $high)
{
	//$low = 0;
	//$high = count($arr) - 1;
	$base = $arr[$low];

	while($high > $low) {
		while($low < $high && $arr[$high] >= $base)
		{
			$high--;
		}
		$arr[$low] = $arr[$high];
		while($low < $high && $arr[$low] <= $base)
		{
			$low++;
		}
		$arr[$high] = $arr[$low];
	}
	$arr[$low] = $base;
	return $low;
}

function quickSort(&$arr, $low, $high)
{
	if ($high > $low) {
		$pt = partition($arr, $low, $high);
		quickSort($arr, $low, $pt-1);
		quickSort($arr, $pt+1, $high);
	}
	
}
quickSort($arr, 0, count($arr)-1);
print_r($arr);

 

第二種:

下面的排序,是使用到了PHP自帶的 array_merge() 數組合並函數,並且通過循環遍歷,每次都需要申請內存。

function quickSort1($arr)
{
    $len = count($arr);
    if ($len <= 1) {
        return $arr;
    }

    $v = $arr[0];
    $low = $up = array();
    for ($i = 1; $i < $len; ++$i) {
        if ($arr[$i] > $v) {
            $up[] = $arr[$i];
        } else {
            $low[] = $arr[$i];
        }
    }
    $low = quickSort($low);
    $up = quickSort($up);

    
	$b = array_merge($low, array($v), $up);
	//print_r($b)."\n";
	return $b;
}

$a = [6,1,3,2,8,5,9];
var_dump(quickSort($a));

待更。。。。

快排算法的應用:

 

1. 求無序數組中中位數

改變第一種方法裏的 quickSort方法:

function quickSortMid(&$arr, $low, $high)
{
	$size = count($arr);
	$mid = ceil(($size-1) / 2); // 當size爲偶數時,向上取整。因爲當pt 大於 mid時,中位數一定在左邊數組,當等於時,中位數也一定包含在數組中
	if ($high > $low) {
		$pt = partition($arr, $low, $high);
		if ($pt > $mid) {
			quickSort($arr, $low, $pt-1);
		}
		if ($pt < $mid) {
			quickSort($arr, $pt+1, $high);
		}
		if ($pt == $mid) {
			$high = $low;
		}
		
	}
	
}

2. 求無序數組的第 k 大數

 

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