PHP中数组的三种排序方法分享

   2015-11-09 0
核心提示:PHP中数组的三种排序方法,主要包括冒泡排序法、选择排序法、插入排序法,需要的朋友可以参考下
一、冒泡排序法
说明:找到最大的数,排列到最后面,然后继续找

例:
复制代码 代码如下:

$arr = array(3,5,-1,0,2);
for($i=0;$i<count($arr)-1;$i++){
for($j=0;$j<count($arr)-1-$i;$j++){
if($arr[$j]>$arr[$j+1]){
$temp = $arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$temp;
}
}
}

理解:
3,5,-1,0,2
//从第一个数开始往后比较,如果比后面的数大则与后面的数调位置
//第一次,3小于5,那么不变
//第二次,5大于-1,那么变成
3,-1,5,0,2
//第三次,5大于0
3,-1,0,5,2
//第四次,5大于2
3,-1,0,2,5
至此完成一次内循环,此时最后一个数完成排序,下次将不参与
3,-1,0,2,5第二次外循环开始 第一次:3大于-1
-1,3,0,2,5
第二次:3大于0
-1,0,3,2,5
第三次:3大于2
-1,0,2,3,5
至此完成后面两位数的排序了,接下来类推
-1,0,2,3,5
二、选择排序法
说明:先假设第一个数就是最小的数,然后将后面的数依次与它比较,如果假设的数不是最小的数,就将它与后面的最小的数调换位置
复制代码 代码如下:

$arr=array(2,1,-1,3,0);
for($i=0;$i<count($arr)-1;$i++){
$minval = $arr[$i];
$minindex = $i;
for($j=1+$i;$j<count($arr);$j++){
if($arr[$j]<$minval){
$minval = $arr[$j];
$minindex = $j;
}
}
$temp = $arr[$i];
$arr[$i] = $arr[$minindex];
$arr[$minindex] = $temp;
}

理解:
2,1,-1,3,0
//先假设第一个数2为最小值,它后面的数依次与2做比较,寻找到最小的那个数
过程:
1小于2,那么minval=1
-1小于1,那么minval=-1
3大于-1,不变
0大于-1,不变
那么现在就找到了该数组中最小的数了为-1
将-1与2调换位置就完成第一个数的排序了
那么现在数组变成
-1,1,2,3,0
现在第一个数-1已经为有序,所以不参与比较了,往后面继续
现在假设minval=1
2大于1,不变
3大于1,不变
0小于1,那么minval=0
现在一次循环完成,调换0与1的位置完成第二个数的排序
那么现在数组变成
-1,0,2,3,1
//后面的推法与上面相同。。。

三、插入排序法

说明:先假设一个数组中的第一个数为单独的有序数组,再将后面的一个数与它【这里随它I的增长,就变成它们了】做比较,如果后面的数比假设的数还小,则将小的那个数后移,最后将那个数移到最前面
复制代码 代码如下:

$arr=array(2,1,-1,3,0);
for($i=1;$i<count($arr);$i++){
$insertval=$arr[$i];
$insertindex = $i-1;
while($insertindex>=0 && $insertval<$arr[$insertindex]){
$arr[$insertindex+1]=$arr[$insertindex];
$insertindex--;
}
$temp = $arr[$i];
$arr[$insertindex+1]=$insertval;
}

理解:
2,1,-1,3,0
//第一次,先保存待插入的数1为insertval,再拿 insertval 与2比较,1小于2,所以把2后移,变成如下的图
2,2,-1,3,0
//此时2前面没有数字了,insertindex=0,所以比较完成,那么将insertval插入到寻找到的这个位置。变成如下图
1,2,-1,3,0
//此时,1,2变成有序数组
//第二次,先保存待插入的数-1为insertval,再拿insertval与2做比较,-1小于2,所以把2后移,变成如下图
1,2,2,3,0
//此时,再拿insertval与1做比较,-1小于1,那么把-1后移,变成如下图(这就是一个拿待插入数与前面的有序数组比较的过程)
1,1,2,3,0
//此时,insertindex到头了,所以将insertval插入该位置
-1,1,2,3,0
//后面推法如上
 
标签: 数组 排序
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • Swift数组的加法运算符用法:array1 += array2
    var stringList1 = [String]()//创建String类型空数组var stringList2 = ["1", "3", "5", "7", "zoo", "9","zoo"]var stringList3 :[String] = ["2", "4", "6","apple&q
    02-09
  • ">C# 使用SIMD向量类型加速浮点数组求和运算(1
    作者: 目录一、缘由二、使用向量类型2.1 基本算法2.2 使用大小固定的向量(如 Vector4)2.2.1 介绍2.2.2 用Vector4编写浮点数组求和函数2.3 使用大小与硬件相关的向量(如 VectorT)2.3.1 介绍2.2.1.1 使用经验2.3.2 用 VectorT 编写浮点数组求和函数三、搭
    02-09
  • 一个把String转成byte数组的小程序 java string
    来源:http://www.study-code.com/java/j2se/66420.htm /**@类功能:将一个文件中的String声明转换成byte[] 声明***@作者:关文柏*@时间:2006年11月11日*///---------------------------------------------------------------////NOTE: Make sure the identifi
    02-09
  • 【Rust】字节数组 rust 字符串
    环境Rust 1.56.1VSCode 1.61.2概念参考:https://doc.rust-lang.org/rust-by-example/std/str.html示例在字符串前加上一个 b 来表示。main.rsuse std::str;fn main() {let bytestring = b"this is a byte string";println!("A byte string: {:?}", bytestring
    02-09
  • 【小实验】rust的数组是在堆上分配还是在栈上分
    先看代码: fn main(){ let v = [1,2,3,4,5]; let addr = v[0] as *const i32 as usize;println!("arr={}, addr=0x{:X}", v.len(), addr); // let top = 1; let addr1 = top as *const i32 as usize; println!("stack top:0x{:X}", addr1);}编译:rustc array
    02-09
  • 【Rust】可变数组 rust二维数组
    环境Rust 1.56.1VSCode 1.61.2概念参考:https://doc.rust-lang.org/rust-by-example/std/vec.html示例可变数组(Vector)存储在堆上和普通数组的区别是长度可变。main.rsfn main() {let collected_iterator: Veci32 = (0..10).collect();println!("Collected
    02-09
  • Rust 旋转数组
    经典三旋转:旋转数组经典算法就是三旋转先整体旋转之后在局部旋转需要注意 求余运算,超过数组长度后要取余数后在旋转如:[1,2,3,4,5,6,7]  3     [7,6,5,4,3,2,1]  整体旋转     [5,6,7,4,3,2,1]  [..k] 旋转     [5,6,7,1,2,3,4]  [k..]
    02-09
  • Delphi 的内存操作函数1-2: 给数组指针分配内存
    GetMemAllocMemReallocMemFreeMemGetMemoryReallocMemoryFreeMemoryNewDisposeNewStrDisposeStrStrNewStrAllocStrDisposeGlobalAllocPtrGlobalFreePtrWideStrAllocAnsiStrAllocStrDisposeMoveMoveMemoryCopyMemoryZeroMemoryFillMemoryFillCharStrBufSize给字
    02-09
  • Delphi 变体数组 Dataset Locate 查找定位
    Format 函数 Delphi 支持“开参数”和动态数组,变体数组,使用时的语法类似 Delphi 中的集合:采用两个方括号把不同类型的变量括起来(这太方便了啊),也可以采用声明一个 TVarRec 类型的数组来容纳不同的类型变量(具体请参阅其帮助文档)Format函数声明比
    02-09
  • Delphi指针总结 delphi 数组指针
    看一个指针用法的例子:      1          var      2              X,    Y:    Integer;        //    X    and    Y    整数类型      3              P:    ^Integer;  
    02-09
点击排行