ホームページ > バックエンド開発 > PHPチュートリアル > クイックソート方法について質問する

クイックソート方法について質問する

WBOY
リリース: 2016-06-23 13:44:59
オリジナル
1003 人が閲覧しました



ディスカッションへの返信(解決策)

$base_num は上書きされません、
これはphpの変数スコープに関連しており、関数内の変数はこの関数内でのみ有効です
つまり、 Quick_sortの再帰呼び出し$base_numは全て独立しています
これはjsとは違うので注意が必要です。もちろん、var は js でローカル変数を宣言するために使用できます

各実行は、静的変数またはグローバル変数でない限り変更されません

$base_num は上書きされません
phpの変数スコープに関係するもので、関数内の変数はこの関数内でのみ有効、つまり再帰的に呼び出されるquick_sortの$base_numは独立しているので注意が必要です。もちろん、var を使用して JS でローカル変数を宣言することもできます

つまり、次のような例を挙げましょう: 3,1,5,4

初めて入力するときは、3 を取り出しますルーラーを使用し、これで 1,5,4 を追加します。これは、左側の配列より小さいものと、右側の配列より大きいものを比較します。 $left=array(1); array(5,4);
$right が再度再帰されると、定規として 5 を取り出し、それと比較します。ルーラーとして使用される値 3 と 5 は、コード
return array_merge($left_array, array($base_num), $right_array); の最後の行にあります。

こうすればもっとはっきりと見えます
print_r(quick_sort(array(6,1,5,8,7,4,2,3,0)));function quick_sort($arr) {	//先判断是否需要继续进行	$length = count($arr);	if($length <= 1) {		return $arr;	}	//如果没有返回,说明数组内的元素多于 1 个,需要排序	//选择一个标尺	//选择第一个元素	$base_num = $arr[0];	//遍历 除了标尺外所有元素,按照大小关系放入两个数组内	//初始化两个数组	$left_array = array(); //小于标尺的	$right_array = array(); //大于标尺的	for($i=1; $i<$length; $i++) {		if($base_num > $arr[$i]) {			//放入左边数组			$left_array[] = $arr[$i];		} else {			//放入右边数组			$right_array[] = $arr[$i];		}	}printf("in[%s] B[%d] L[%s] R[%s]<br>", join(',', $arr), $base_num, join(',', $left_array), join(',', $right_array));	//再分别对 左边 和 右边 得得数组进行相同的排序处理	//递归调用这个函数,并记录结果	$left_array = quick_sort($left_array);	$right_array = quick_sort($right_array);	//合并左边、标尺、右边	return array_merge($left_array, array($base_num), $right_array);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
in[6,1,5,8,7,4,2,3,0] B[6] L[1,5,4,2,3,0] R[8,7]in[1,5,4,2,3,0] B[1] L[0] R[5,4,2,3]in[5,4,2,3] B[5] L[4,2,3] R[]in[4,2,3] B[4] L[2,3] R[]in[2,3] B[2] L[] R[3]in[8,7] B[8] L[7] R[]Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 ) 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

こうすればもっとはっきりと見えます
print_r(quick_sort(array(6,1,5,8,7,4,2,3,0)));function quick_sort($arr) {	//先判断是否需要继续进行	$length = count($arr);	if($length <= 1) {		return $arr;	}	//如果没有返回,说明数组内的元素多于 1 个,需要排序	//选择一个标尺	//选择第一个元素	$base_num = $arr[0];	//遍历 除了标尺外所有元素,按照大小关系放入两个数组内	//初始化两个数组	$left_array = array(); //小于标尺的	$right_array = array(); //大于标尺的	for($i=1; $i<$length; $i++) {		if($base_num > $arr[$i]) {			//放入左边数组			$left_array[] = $arr[$i];		} else {			//放入右边数组			$right_array[] = $arr[$i];		}	}printf("in[%s] B[%d] L[%s] R[%s]<br>", join(',', $arr), $base_num, join(',', $left_array), join(',', $right_array));	//再分别对 左边 和 右边 得得数组进行相同的排序处理	//递归调用这个函数,并记录结果	$left_array = quick_sort($left_array);	$right_array = quick_sort($right_array);	//合并左边、标尺、右边	return array_merge($left_array, array($base_num), $right_array);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
in[6,1,5,8,7,4,2,3,0] B[6] L[1,5,4,2,3,0] R[8,7]in[1,5,4,2,3,0] B[1] L[0] R[5,4,2,3]in[5,4,2,3] B[5] L[4,2,3] R[]in[4,2,3] B[4] L[2,3] R[]in[2,3] B[2] L[] R[3]in[8,7] B[8] L[7] R[]Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 ) 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー


こうすればもっとはっきりと見えます
print_r(quick_sort(array(6,1,5,8,7,4,2,3,0)));function quick_sort($arr) {	//先判断是否需要继续进行	$length = count($arr);	if($length <= 1) {		return $arr;	}	//如果没有返回,说明数组内的元素多于 1 个,需要排序	//选择一个标尺	//选择第一个元素	$base_num = $arr[0];	//遍历 除了标尺外所有元素,按照大小关系放入两个数组内	//初始化两个数组	$left_array = array(); //小于标尺的	$right_array = array(); //大于标尺的	for($i=1; $i<$length; $i++) {		if($base_num > $arr[$i]) {			//放入左边数组			$left_array[] = $arr[$i];		} else {			//放入右边数组			$right_array[] = $arr[$i];		}	}printf("in[%s] B[%d] L[%s] R[%s]<br>", join(',', $arr), $base_num, join(',', $left_array), join(',', $right_array));	//再分别对 左边 和 右边 得得数组进行相同的排序处理	//递归调用这个函数,并记录结果	$left_array = quick_sort($left_array);	$right_array = quick_sort($right_array);	//合并左边、标尺、右边	return array_merge($left_array, array($base_num), $right_array);}
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
in[6,1,5,8,7,4,2,3,0] B[6] L[1,5,4,2,3,0] R[8,7]in[1,5,4,2,3,0] B[1] L[0] R[5,4,2,3]in[5,4,2,3] B[5] L[4,2,3] R[]in[4,2,3] B[4] L[2,3] R[]in[2,3] B[2] L[] R[3]in[8,7] B[8] L[7] R[]Array ( [0] => 0 [1] => 1 [2] => 2 [3] => 3 [4] => 4 [5] => 5 [6] => 6 [7] => 7 [8] => 8 ) 
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

これはとても直感的です!ありがとう〜

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート