php 实现冒泡算法排序、快速排序、选择排序,插入排序
许多人都说 算法是程序的核心,一个程序的好于差,关键是这个程序算法的优劣。作为一个初级phper,虽然很少接触到算法方面的东西 。但是对于冒泡排序,插入排序,选择排序,快速排序四种基本算法,我想还是要掌握的。下面是我按自己的理解,将四个方法分析一遍。
需求:分别用 冒泡排序法,快速排序法,选择排序法,插入排序法将下面数组中 的值按照从小到的顺序进行排序。
$arr(1,43,54,62,21,66,32,78,36,76,39);
1. 冒泡排序法
* 思路分析:法如其名,就是像冒泡一样,每次从数组当中 冒一个最大的数出来。
* 比如:2,4,1 // 第一次 冒出的泡是4
* 2,1,4 // 第二次 冒出的泡是 2
* 1,2,4 // 最后就变成这样
$arr
=
array
(1,43,54,62,21,66,32,78,36,76,39);
function
getpao(
$arr
)
{
$len
=
count
(
$arr
);
//设置一个空数组 用来接收冒出来的泡
//该层循环控制 需要冒泡的轮数
for
(
$i
=1;
$i
<
$len
;
$i
++)
{
//该层循环用来控制每轮 冒出一个数 需要比较的次数
for
(
$k
=0;
$k
<
$len
-
$i
;
$k
++)
{
if
(
$arr
[
$k
]>
$arr
[
$k
+1])
{
$tmp
=
$arr
[
$k
+1];
$arr
[
$k
+1]=
$arr
[
$k
];
$arr
[
$k
]=
$tmp
;
}
}
}
return
$arr
;
}
function
select_sort(
$arr
) {
//实现思路 双重循环完成,外层控制轮数,当前的最小值。内层 控制的比较次数
//$i 当前最小值的位置, 需要参与比较的元素
for
(
$i
=0,
$len
=
count
(
$arr
);
$i
<
$len
-1;
$i
++) {
//先假设最小的值的位置
$p
=
$i
;
//$j 当前都需要和哪些元素比较,$i 后边的。
for
(
$j
=
$i
+1;
$j
<
$len
;
$j
++) {
//$arr[$p] 是 当前已知的最小值
if
(
$arr
[
$p
] >
$arr
[
$j
]) {
//比较,发现更小的,记录下最小值的位置;并且在下次比较时,
// 应该采用已知的最小值进行比较。
$p
=
$j
;
}
}
//已经确定了当前的最小值的位置,保存到$p中。
//如果发现 最小值的位置与当前假设的位置$i不同,则位置互换即可
if
(
$p
!=
$i
) {
$tmp
=
$arr
[
$p
];
$arr
[
$p
] =
$arr
[
$i
];
$arr
[
$i
] =
$tmp
;
}
}
//返回最终结果
return
$arr
;
}
function
insert_sort(
$arr
) {
//区分 哪部分是已经排序好的
//哪部分是没有排序的
//找到其中一个需要排序的元素
//这个元素 就是从第二个元素开始,到最后一个元素都是这个需要排序的元素
//利用循环就可以标志出来
//i循环控制 每次需要插入的元素,一旦需要插入的元素控制好了,
//间接已经将数组分成了2部分,下标小于当前的(左边的),是排序好的序列
for
(
$i
=1,
$len
=
count
(
$arr
);
$i
<
$len
;
$i
++) {
//获得当前需要比较的元素值。
$tmp
=
$arr
[
$i
];
//内层循环控制 比较 并 插入
for
(
$j
=
$i
-1;
$j
>=0;
$j
--) {
//$arr[$i];//需要插入的元素; $arr[$j];//需要比较的元素
if
(
$tmp
<
$arr
[
$j
]) {
//发现插入的元素要小,交换位置
//将后边的元素与前面的元素互换
$arr
[
$j
+1] =
$arr
[
$j
];
//将前面的数设置为 当前需要交换的数
$arr
[
$j
] =
$tmp
;
}
else
{
//如果碰到不需要移动的元素
//由于是已经排序好是数组,则前面的就不需要再次比较了。
break
;
}
}
}
//将这个元素 插入到已经排序好的序列内。
//返回
return
$arr
;
}
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
];
}
}
//再分别对 左边 和 右边的数组进行相同的排序处理方式
//递归调用这个函数,并记录结果
$left_array
= quick_sort(
$left_array
);
$right_array
= quick_sort(
$right_array
);
//合并左边 标尺 右边
return
array_merge
(
$left_array
,
array
(
$base_num
),
$right_array
);
}
php 实现冒泡算法排序、快速排序、选择排序,插入排序的更多相关文章
- 算法与数据结构(十三) 冒泡排序、插入排序、希尔排序、选择排序(Swift3.0版)
本篇博客中的代码实现依然采用Swift3.0来实现.在前几篇博客连续的介绍了关于查找的相关内容, 大约包括线性数据结构的顺序查找.折半查找.插值查找.Fibonacci查找,还包括数结构的二叉排序树以 ...
- JS快速排序 希尔排序 归并排序 选择排序
/* 快速排序 1.1 算法描述 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用.快速排序是一种既不浪费空间又可以快一 ...
- Java常见排序算法之直接选择排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- Java排序算法之直接选择排序
Java排序算法之直接选择排序 基本过程:假设一序列为R[0]~R[n-1],第一次用R[0]和R[1]~R[n-1]相比较,若小于R[0],则交换至R[0]位置上.第二次从R[1]~R[n-1]中选 ...
- 排序算法系列:选择排序算法JAVA版(靠谱、清晰、真实、可用、不罗嗦版)
在网上搜索算法的博客,发现一个比较悲剧的现象非常普遍: 原理讲不清,混乱 啰嗦 图和文对不上 不可用,甚至代码还出错 我总结一个清晰不罗嗦版: 原理: 从数组头元素索引i开始,寻找后面最小的值(比i位 ...
- 冒泡排序算法和简单选择排序算法的js实现
之前已经介绍过冒泡排序算法和简单选择排序算法和原理,现在有Js实现. 冒泡排序算法 let dat=[5, 8, 10, 3, 2, 18, 17, 9]; function bubbleSort(d ...
- IOS算法(二)之选择排序
选择排序: 每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后.直到所有待排序的数据元素排完. 选择排序是不稳定的排序方法. 一. 算法描写叙述 选择排序:比方在一 ...
- 选择排序—简单选择排序(Simple Selection Sort)
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
- 排序(Sort)-----选择排序
声明:文中动画转载自https://blog.csdn.net/qq_34374664/article/details/79545940 1.选择排序简介 选择排序(Select Sort ...
- 选择排序—简单选择排序(Simple Selection Sort)原理以及Java实现
基本思想: 在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换:然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素 ...
随机推荐
- [教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續)
[教程] [承風雅傳HSU]用ES4封裝Win7---ES4 Win7封裝教程(未完待續) a10036it 发表于 2015-7-27 21:11:19 https://www.itsk.com/t ...
- WEB服务器配置
1.这是我的新服务器,还未做任何配置,系统为windows server2012 R2. 2.首先打开IE浏览器,这里弹出一个对话框,我选择的不推荐. 3.然后下载jdk,并安装 安装直接点下一步,下 ...
- activitygroup下的activity不回调onactivityresult的解决方法
就是activitygroup下的子activity启动第三方activity的时候需要通过getparent的startactivityforresult方法来启动.getparent其实就是这个a ...
- php知识分享
PHP 获取ip地址代码汇总 ...
- php知识案列1
用PHP,在1-20间随机产生5个不重复的值,如何做 复制代码 代码如下: <?php function NoRand($begin=0,$end=20,$limit=5){ $rand_arr ...
- 用 highlight.js 为文章中的代码添加语法高亮
来源:http://www.ghostchina.com/adding-syntax-highlighting-to-ghost-using-highlight-js/ --------------- ...
- 我的毕业设计——基于安卓和.NET的笔记本电脑远程控制系统
手机端: 电脑端: 答辩完成后会开放代码.
- 雅美尓(yaml)实战
献给跟我一样对yaml(雅美尓)有婶婶挫败感的同学! 开始第一个pylon工程,我们就跟yaml配置文件开始了不解之缘.yaml是什么?它有哪些规则? 大IBM的文章如是说:YAML 是一种比 XML ...
- curl --connect-timeout 判断国内外网络windows 批处理
1.下载编译curl curl 下载地址:http://curl.haxx.se/download.html ,下载后解压到一个目录,使用vs开发者工具里的 “Visual Studio 命令提示(2 ...
- android xfermode绘图
1.fermode:是来自 transfer-modes,在画笔中设置xfermode后,画笔在使用的时候就会应用设置的像素转换模式.就类似于ps中的选取功能,留下的选取是从原选区中去除还是合并,取交 ...