php 数组(2)
数组排序算法
冒泡排序,是一种计算机科学领域的较简单的排序算法。它重复地访问要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们减缓过来。走访数列的工作室重复的进行直到没有再需要交换,也就是说该数列已经排序完成
思路:
比较相邻的元素,如果第一个比第二个大,就交换他们两个
对每一个相邻元素做同样的的工作,从开始第一对到结尾的最后一对,在这一点,最后的元素应该会是最大的数
针对所有的元素重复以上的步骤,除了最后一个
持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较
$arr = array(1,5,3,6,2,,9,8,7,4);
for($i = 0,$len = count($arr);$i < $len;$i++){
for($j = 0;$j < $len - 1 - $i;$j++){
if($arr[$j] > $arr[$j + 1]){
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
-----
选择排序,是一种简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完,选择排序是不稳定的排序方法(如:序列[5,5,3]第一次就将第一个[5]与[3]交换,导致第一个5移动到第二个5后面)
思路:
假设第一个元素为最小元素,记下下标
寻找右侧剩余的元素,如果有更小的重新记下最新的下标
如果有新的最小的,交换两个元素
往右重复以上的步骤,知道元素本身是最后一个
$arr = array(1,5,3,6,2,,9,8,7,4);
// 确定要交换多少次,一次只能找到一个最小的,需要找数组长度对应的次数
for($i = 0,$len = count($arr);$i < $len;$i++){
// 假设当前第一个已经排好序
$min = $i; // 当前第一个数时最小的
// 比较当前元素与选定的最小的元素
for ($j = $i + 1;$j < $len;$j++){
if($arr[$j] < $arr[$min]){
// 说明当前指定的 $min 不合适
$min = $j;
}
}
// 交换当前选定的值与实际最小的元素值
if($min != $i){
$temp = $arr[$i];
$arr[$i] = $arr[$min];
$arr[$min] = $temp;
}
}
echo '<pre>';
print_r($arr);
-----
插入排序,基本操作就是讲一个数据插入到已经排好序的有序数据中,从而得到一个新的,个数加一的有序数据,算法适用于少量数据的排序,是稳定的排序方法,插入算法把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就指包含这一元素(即待插入元素)。在第一部分排序完成后,再讲这个最后元素插入到已排好序的第一部分中。
思想:每步将一个待 排序的记录,按其关键码值的大小插入前面已经排序的文件中适当位置上,直到全部插入完为止
设置监视哨 r[0],将待插入记录的值赋值给 r[0];
设置开始查找的位置 j;
在数组中进行搜索,搜索中将第 j 个记录后移,直至 r[0].key>=r[j].key 为止;
将 r[j+1] 的位置上
认定第一个元素已经排好序
取出第二个元素,作为待插入数据
与已经排好序的数组的最右侧元素开始进行比较
如果后面的小于前面的:说明前面已经排好序的那个数组元素不在对的位置(向后移一个),然后让新的元素填充进去(继续向前比:高级)
重复前面的步骤:直到当前元素插入到对的位置,直到所有的数组元素都插入到对的位置
$arr = array(4,7,6,8,3,1,5,9,);
// 确定要插入多少回(假设一个数组一次性插入到对的位置,同时第一位置是假设对的)
for($i = 1,$len = count($arr);$i < $len;$i++){
// 取出当前要插入的元素的值
$temp = $arr[$i];
// 标记:默认说明当前要插入的数组的位置是对的
$change = false;
// 让该数据与前面已经排好序的数组元素重复比较(挨个比较),直到的位置(交换)
for($j = $i - 1;$j >= 0;$j--){
// 比较
if($arr[$j] > $temp){
// 说明当前要插入的元素,比前面的已经排好序的元素的值要小:交换位置
$arr[$j + 1] = $arr[$j];
// $arr[$j] = $temp;
// 说明前面顺序的数组元素有不合适的位置
$change = true;
}else{
// 说明当前待插入元素,不前面的元素要大:说明位置正确
break;
}
}
//
if($change){
// 有数据移动:站错位置
$arr[$j + 1] = $temp;
}
echo '<pre>';
print_r($arr);
-----
快速排序,是对冒泡排序的一种改进,通过一趟排序将要排序的数据分割成独立的两个部分,其中一部分的所有数据都比另外一部分的所有数据都要笑,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列
设要排序的数组是 A[0]......A[N - 1],首先任意选取一个数据(通常选用数组的第一个数),作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序,值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时产生变动
从数组中选出一个元素(通常第一个),作为参照对象
定义两个数组,将目标数组中剩余的元素与参照元素挨个比较:小的放到一个数组,大的放到另外一个数组
第二步执行完后,前后的数组顺序不确定,但是确定了自己的位置
将得到的小数组按照第1到第3部重复操作(子问题)
回溯最小数组(一个元素)
$arr = array(1,5,6,3,4,9,8,7,2);
function quick_sort($arr){
// 递归出口
$len count($arr);
if(len <= 1) return $arr;
// 取出某个元素,然后将剩余的数组元素,分散到两个不同的数组中
$left = $right = array();
for($i = 1;$i < $len;$i++){
// 第一个元素作为元素
// 比较:小的放left中,大的放入right 中
if($arr[$i] < $arr[0]){
$left[] = $arr[$i];
}else{
$right[] = $arr[$i];
}
}
$left = quick_sort($left);
$right = quick_sort($right);
return array_mergr($left,(array)$arr[0],$right);
}
echo '<pre>';
print_r(quick_sort($arr));
-----
归并排序,是建立在归并操作上的一种有效的排序算法,该算法是采用分治法的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列有序。若将两个有序表合并成一个有序表,称为二路归并
$arr1 = array(1,5,9);
$arr3 = array(2,4,8);
// 取出一个空数组用于归并空间
$arr3 = array();
while(count($arr1) && count($arr2)){
// 只要$arr1 和 $arr2里面还有元素,就进行循环
// 取出每一个数组的第一个元素:进行比较
$arr3[] = $arr1[0] < $arr2[0] ? array_shift($arr1) : array_shift($arr2);
}
print_r(array_merge($arr3,$arr1,$arr2));
将数组拆分成两个数组
重复上步骤将数组拆分成最小单元
申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
设定两个指针,最初位置分别为两个已经排序序列的起始位置
比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
重复步骤3直到某一指针超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
$arr = array(1,4,7,2,5,8,3,6,9);
function mege_sort($arr){
// 递归出口
$len = count($arr);
if($len <= 1) return $arr; $middle = floor($len / 2);
$left = array_slice($arr,0,$middle);
$right = array_slice($arr,$middle); // 递归点:$left $right 都没有排好序,而且可能是多个元素的数组
$left = mege_sort($left);
$right = mege_sort($right); $m = array();
while(count($left) && count($right)){
// 只要$left和 $right里面还有元素,就进行循环
// 取出每一个数组的第一个元素:进行比较
$m[] = $left[0] < $right[0] ? array_shift($left) : array_shift($right);
}
return array_merge($m,$left,$right);
}
print_r(merge_sort($arr));
-----
查找算法
含义:查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算。查找算法是指实现查找过程对应的代码结
顺序查找:也成为线型查找,从数据结构线型表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值比较,若相等则表示查找成功,若扫描结束没有找到关键字等于给定的值的结点,表示查找失败
$arr = array(52,4,6,1,3,82,13,9,6,313);
function check_order($arr,$num){
for($i = 0,$len = cout($arr);$i < $len;$i++){
if($arr[$i] == $num){
return $i;
}
}
return false;
}
varr_dump(check_order($arr,5));
二分查找:要求线型表中的结点按关键字值升序或降序排序,用给定值与中间结点的关键字比较,中间结点把线型表分成两个子表,若相等则表示成功;若不相等,再根据给定的值与该中间结点关键字的比较结果确定下一步查找那个子表,这样递归进行,直到查找到货查找结束发现表中没有相等的结点
$arr = array(52,4,6,1,3,82,13,9,6,313);
$res = 5;
function check_break($arr,$res){
// 得到数组边界
$right = count($arr);
$left = 0;
// 循环匹配
whilr($left <= $right){
// 得到中间位置
$middle = floor(($right + $left) / 2);
// 匹配数据
if($arr[$middle] == $res){
return $middle + 1;
}
// 没有找到
if($arr[$middle] < $res){ $left = $middle +1;
}else{ $right = $middle + 1;
} }
return false;
}
var_dump(check_break($arr,$res));
-----
php 数组(2)的更多相关文章
- javascript中的Array对象 —— 数组的合并、转换、迭代、排序、堆栈
Array 是javascript中经常用到的数据类型.javascript 的数组其他语言中数组的最大的区别是其每个数组项都可以保存任何类型的数据.本文主要讨论javascript中数组的声明.转换 ...
- 探究javascript对象和数组的异同,及函数变量缓存技巧
javascript中最经典也最受非议的一句话就是:javascript中一切皆是对象.这篇重点要提到的,就是任何jser都不陌生的Object和Array. 有段时间曾经很诧异,到底两种数据类型用来 ...
- 编写高质量代码:改善Java程序的151个建议(第5章:数组和集合___建议75~78)
建议75:集合中的元素必须做到compareTo和equals同步 实现了Comparable接口的元素就可以排序,compareTo方法是Comparable接口要求必须实现的,它与equals方法 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- JavaScript权威指南 - 数组
JavaScript数组是一种特殊类型的对象. JavaScript数组元素可以为任意类型,最大容纳232-1个元素. JavaScript数组是动态的,有新元素添加时,自动更新length属性. J ...
- JavaScript常见的五种数组去重的方式
▓▓▓▓▓▓ 大致介绍 JavaScript的数组去重问题在许多面试中都会遇到,现在做个总结 先来建立一个数组 var arr = [1,2,3,3,2,'我','我',34,'我的',NaN,NaN ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- javascript数组查重方法总结
文章参考地址:http://blog.csdn.net/chengxuyuan20100425/article/details/8497277 题目 对下列数组去重: var arr = ['aa', ...
- 掌握javascript中的最基础数据结构-----数组
这是一篇<数据结构与算法javascript描述>的读书笔记.主要梳理了关于数组的知识.部分内容及源码来自原作. 书中第一章介绍了如何配置javascript运行环境:javascript ...
- 小兔JS教程(四)-- 彻底攻略JS数组
在开始本章之前,先给出上一节的答案,参考答案地址: http://www.xiaotublog.com/demo.html?path=homework/03/index2 1.JS数组的三大特性 在J ...
随机推荐
- Snipaste屏幕截图的使用
什么是Snipaste Snipaste是一款屏幕截图软件 类似于微信的截图 Snipaste使用步骤 百度搜索Snipaste 如图 点击 根据自己电脑系统选择安装 下载完成后 解压到当前文件夹 点 ...
- C++核心编程 4 类和对象-对象的初始化和清理
构造函数和析构函数 对象的初始化和清理工作是两个非常重要的安全问题,一个对象或者变量没有初始状态,对其使用结果是未知的,同样,使用完一个对象或变量,没有及时清理,也会造成一定的安全问题.C++利用了构 ...
- Hibernate的介绍及入门小案例
1.Hibernate的诞生 在以前使用传统的JDBC开发应用系统时,如果是小型应用系统,并不觉得有什么麻烦,但是对于大型应用系统的开发,使用JDBC就会显得力不从心,例如对几十,几百张包含几十个字段 ...
- 最新.NET MAUI有什么惊喜?
.NET 6 Preview 7 现已发布啦,我们为 .NET 多平台应用程序 UI (MAUI) 引入了所有的新布局.这是性能和可靠性的重大变化.我们很高兴我们还增加了一些关于accessibili ...
- iNeuOS工业互联网操作系统,设备振动状态监测、预警和分析应用案例
目 录 1. 概述... 2 2. 系统部署结构... 2 3. 系统应用介绍... 4 4. 专业分析人员... 8 5. 应用案例分享 ...
- 新手小白在github上部署一个项目
新手小白在github上部署一个项目 一. 注册github账号 github地址:https://www.github.com/ 二.下载安装Git 地址:https://git-scm.com/d ...
- 【UE4 C++】 Config Settings配置文件(.ini)
简介 常见存储路径 \Engine\Config\ \Engine\Saved\Config\ (运行后生成) [ProjectName]\Config\ [ProjectName]\Saved\Co ...
- docker逃逸漏洞复现(CVE-2019-5736)
漏洞概述 2019年2月11日,runC的维护团队报告了一个新发现的漏洞,SUSE Linux GmbH高级软件工程师Aleksa Sarai公布了影响Docker, containerd, Podm ...
- kivy 选择框
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.lang import builder # 注册 ...
- BUAA_2019_OO_第一单元总结
一.基于度量来分析自己的程序结构 1.第一次作业 1.1类图: 第一次作业由于比较简单,我采用了面向过程的编程方式.在Polynomail类的构造函数中将项直接求导输出.这样的弊端显而易见,不能进行优 ...