四基础排序算法:插入排序、选择排序、冒泡排序、快速排序

	/**
	 * 插入排序(Insertion Sort)的基本思想是:
	 * 每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
	 * 插入排序:就是把第一个数当成已排序还的序列,然后把后面的数一个一个插入到前面适当的位置
	 */
	function insert_sort($arr){
		//计算数组元素个数
		$total_count = count($arr);

		if($total_count <= 0) return 0;

		//从这里开始循环 从1开始,表示把序列的第一个元素当成有序序列
		for ($i = 1; $i < $total_count; $i++) {

			$current = $arr[$i];

			$j = $i - 1 ;
			//$current 在while循环里面,值一直没有变化,只是位置有变化
			while ($current < $arr[$j]) {
				$arr[$j+1] = $arr[$j] ;
				$arr[$j] = $current;
				$j--;
				if($j < 0) break;
			}
		}
		return $arr;
	}
	/**
	 * 选择排序(Selection Sort)的基本思想是:
	 * 每一趟从待排序的记录中选出关键字最小的记录,顺序放在已排好序的子文件的最后,直到全部记录排序完毕。
	 * 选择排序:每次都选出最小的一个放在最前面,最开始的时候把第一个当做最小的
	 */
	function select_sort($arr){
		$total_count = count($arr);

		if($total_count <= 0) return 0;

		for ($i=0; $i < $total_count; $i++) { 

			//拿第一个后面的每一个与第一比,每次比完都是把小的放在第一个的位置 ,比完内层的这个for循环,就选出了最小的一个
			for ($j = $i + 1 ; $j < $total_count; $j++) { 

				$f = $i;

				if($arr[$f] > $arr[$j]){
					$f = $j;
				}
				if($f != $i){ //如果不等于,表示上一个if 发生了

					$temp = $arr[$i];

					$arr[$i] = $arr[$f];

					$arr[$f] =  $temp;
				}

			}
		}

		return $arr;
	}

	/**
	 * 冒泡排序的基本思想是:
	 * 两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止
	 */
	function bubble_sort($arr){

		$total_count = count($arr);

		for ($i=0; $i < $total_count; $i++) { 
			
			for ($j=$i+1; $j < $total_count; $j++) { 
				
				if($arr[$i] > $arr[$j]){

					$tmp = $arr[$i];
					$arr[$i] = $arr[$j];
					$arr[$j] = $tmp;
				}
			}
		}

		return $arr;
	}

	 /**
	  * 看看就会明白
	  */
	 function quick_sort($arr){
	 	
	 	$total_count = count($arr);

	 	if($total_count <= 1) return $arr;

	 	$middle = $arr[0];
	 	$left_arr = $right_arr = array();
	 	for ($i=1; $i < $total_count; $i++) { 
	 		
	 		if($arr[$i] > $middle){

	 			$right_arr[] = $arr[$i];

	 		}else{

	 			$left_arr[] = $arr[$i];
	 		}
	 	}
 		$left_arr = quick_sort($left_arr);
 		$right_arr = quick_sort($right_arr);

	 	return array_merge($left_arr , array($middle) , $right_arr);
	 }

参考:http://www.nowamagic.net/librarys/veda/detail/761
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值