插入,冒泡等几种排序算法的对比

每种语言几乎都内置了排序的函数或者方法,很多时候并不需要自己手动书写一些排序算法,因此对于排序算法如何实现都是一知半解,知其然不知其所以然,很多时候看似相同,例如排序算法基本就是比较,交换,但是其中的如何比较,何时交换原理是不同的。

以下代码实现均为PHP
以下动图均来自这位博主的文章

插入排序

实现思路:从第二个元素开始往前比较,如果符合条件,则交换位置

插入排序
代码实现

function insert_sort($arr)
{
	$num = count($arr);
	for ($i = 1; $i < $num; $i++) {
		for ($j = $i-1; $j >= 0; $j--) {
			if ($arr[$j+1] < $arr[$j]) {
				$tmp       = $arr[$j+1];
				$arr[$j+1] = $arr[$j];
				$arr[$j]   = $tmp;
			}else{
			    break;
			}
		}
	}
	return $arr;
}
冒泡排序

实现思路:重复走访要排序的元素列,依次比较两个相邻的元素,如果符合条件,则交换位置

冒泡排序
代码实现

function bubble_sort($arr) 
{
	$num = count($arr);
	for ($i = 0; $i< $num-1; $i++) {
		for ($j = 1; $j < $num-$i; $j++) {
			if ($arr[$j] < $arr[$j-1]) {
				$tmp       = $arr[$j-1];
				$arr[$j-1] = $arr[$j];
				$arr[$j]   = $tmp;
			}
		}
	}
	return $arr;
}
选择排序

实现思路:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾

选择排序
代码实现

function select_sort($arr) 
{
	$num = count($arr);
	for ($i = 0; $i< $num-1; $i++) {
		$index = $i;
		for ($j = $i+1; $j < $num; $j++) {
			if ($arr[$index] > $arr[$j]) {
				$index = $j;
			}
		}
		$tmp         = $arr[$i];
		$arr[$i]     = $arr[$index];
		$arr[$index] = $tmp;
	}
	return $arr;
}
快速排序

实现思路:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。
在这里插入图片描述
代码实现

function quick_sort($arr)
{
	$num = count($arr);
   if ($num <= 1) {
        return $arr;
    }
    $left_arr  = [];
    $right_arr = [];
	$middle    = $arr[0];
	for ($i = 1; $i < $num; $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,  [$middle],  $right_arr);

}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值