经典排序算法 - 快速排序Quick sort

原理,通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列

举个例子
如无序数组[6 2 4 1 5 9]

a),先把第一项[6]取出来,
用[6]依次与其余项进行比较,
如果比[6]小就放[6]前边,2 4 1 5都比[6]小,所以全部放到[6]前边
如果比[6]大就放[6]后边,9比[6]大,放到[6]后边,

一趟排完后变成下边这样:
排序前 6 2 4 1 5 9
排序后 2 4 1 5 6 9
b),对前半拉[2 4 1 5]继续进行快速排序

重复步骤a)后变成下边这样:
排序前 2 4 1 5
排序后 1 2 4 5

前半拉排序完成,总的排序也完成:
排序前:[6 2 4 1 5 9]
排序后:[1 2 4 5 6 9]
排序结束

PHP代码实现参考:

/**
 * 快速排序(常规实现)
 * 工作原理:通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
 * 			 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 *
 * 实现方法:通过基准数
 * 			在一段数组中,以第一个元素为基准数。分别从2边挑选小于和大于这个基准数的位置进行交换。
 * 			两边的位置都向中间靠拢直至相遇,则拿相遇的这个位置的值与基准数交换。
 *			再将此基准数2边的2段数组分别执行上述交换操作,直至无数可交换。
 * @param unknown $arr
 * @return unknown
 */
function quick_sort($arr){
	
	function do_quick_sort(&$arr,$min,$max){
		
		if($min>$max)return false;
		
		$centre_value = $arr[$min];	// 以该段数组的第一个元素为基准数
		$i = $min;		// 左边起点位置(重要,自己也要放到对比中)
		$j = $max;		// 右边起点位置
		
		while ($i!=$j) {
			// 右侧依次向左,也找一个大于基准数的数(重要,需要从右边开始)
			while ($arr[$j]>=$centre_value && $i<$j) $j--;
			
			// 左边依次向右,找一个大于基准数的数
			while ($arr[$i]<=$centre_value && $i<$j) $i++;

			// 交换位置
			swap($arr[$i], $arr[$j]);
		}
		
		//最终将基准数归位
		$arr[$min] 	= $arr[$i];
		$arr[$i] 	= $centre_value;
		
		// 对基准的2侧翼再进行快速排序
		do_quick_sort($arr,$min,$i-1);
		do_quick_sort($arr,$i+1,$max);
	}
	
	do_quick_sort($arr,0,count($arr)-1);
	
	return $arr;
}
/**
 * 快速排序(个人改版,经测试内存消耗更低)
 * 工作原理:通过一趟扫描将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小。
 * 			 然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
 * 
 * 实现方法:通过生成左右2边的子数组再合并的方式
 * @param unknown $arr
 * @return unknown
 */
function quick_sort2($arr){
	if( count($arr)<=1 ){
		return $arr;
	}
	
	$left_arr = $right_arr = [];
	
	// 先以第一个数为中间值,将数组划分到左右两部分
	$centre_value 	= $arr[0];
	$count 			= count($arr);
	for($i=1;$i<$count;$i++){
		if( $arr[$i]<=$centre_value ){
			$left_arr[]  = $arr[$i];
		}else{
			$right_arr[] = $arr[$i];
		}
	}
	
	// 再对这2部分分别进行快速排序成有序数组
	$left_arr 	= quick_sort2($left_arr);
	$right_arr 	= quick_sort2($right_arr);
	
	// 再合并数组返回
	return array_merge($left_arr,[$centre_value],$right_arr);
}


返回主目录  [经典排序算法][PHP实现集锦]

参考:

http://www.cnblogs.com/kkun/archive/2011/11/23/2260270.html

http://developer.51cto.com/art/201403/430986.htm

猜你喜欢

转载自blog.csdn.net/qw_xingzhe/article/details/80508566