php 常用常见算法 (冒泡,选择,插入 ...TBD)

本文详细介绍了几种常见的排序算法,包括选择排序、冒泡排序和插入排序,并通过伪代码展示了每种算法的基本实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

选择排序:
基本思想: 每一趟从待排序的数据元素中选择一个最值作为首元素

$arr = array(3, 1, 4, 7);
function selection_sort($arr)
{
	// 外层循环的轮数
	for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
	{
		for ($j = $i + 1; $j < $len; $j++)
		{
			// 伪代码: 交换两个位置的元素
			swap($i, $j);
		}
	}
	return $arr;
}

选择排序改进:

$arr = array(3, 1, 4, 7);
function advanced_selection_sort($arr)
{
	for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
	{
		$min = $i; // $min 中存放的将是最值(本例是最小值)下标
		for ($j = $i + 1; $j < $len; $j++)
		{
			if ($arr[$j] < $arr[$min])
			{
				$min = $j;
			}
		}
		// 进行交换,如果 $min 发生变化,则交换
		if($min != $i)
		{
			// 伪代码实现
			swap($arr[$min], $arr[$i]);
		}
	}
	return $arr;
}

冒泡排序:
基本思想: 对相邻的元素进行两两比较,根据需要交换,每一趟将一个最值"浮动"到顶端,最终完成排序。

$arr = array(3, 1, 4, 7);
function bubble_sor($arr)
{
	for ($i = 0, $len = count($arr); $i < $len - 1; $i++)
	{
		$flag = true; // 如果有一轮排序中,没有发生交换,则元素已经是正确的顺序,排序结束。
		for ($j = 0; $j < $len -1 - i; $j++)
		{
			// 伪代码实现
			swap($arr[$j], $arr[$j + 1]);
			flag = false;
		}
		if (flag)
		{
			break;
		}
	} 
}

插入排序:
在这里插入图片描述
假定手上的牌是已经排好序的,将每次取到的牌插入合适的位置。只是在程序中,需要为每次待插入的牌挪出一个位置
动画演示:
在这里插入图片描述
图片来源:
https://www.cnblogs.com/onepixel/articles/7674659.html

#define LEN 5
int a[LEN] = {1, 5, 4, 2, 3};

void insertion_sort(void)
{
	int i, j, key;
	// 从 1 到 LEN 每次取一张牌
	for(j = 1; j < LEN; j++)
	{
		printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
		key = a[j];
		i = j - 1;
		// 将已有的牌排好序
		while(i >= 0 && a[i] > key)
		{
			a[i + 1] = a[i];
			i--;
		}
		// 将取到牌插入
		a[i + 1] = key;
	}
	printf("%d, %d, %d, %d, %d\n", a[0], a[1], a[2], a[3], a[4]);
}

int main(void)
{
	insertion_sort();
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡德咏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值