php一维数组的和,php 一维数组排序

二分查找法也叫折半查找法

#二分查找

function binarySearch(Array $arr, $target) {

$low = 0;

$high = count($arr) - 1;

while($low <= $high) {

$mid = floor(($low + $high) / 2);

#找到元素

if($arr[$mid] == $target) return $mid;

#中元素比目标大,查找左部

if($arr[$mid] > $target) $high = $mid - 1;

#重元素比目标小,查找右部

if($arr[$mid] < $target) $low = $mid + 1;

}

#查找失败

return false;

}

$arr = array(1, 3, 5, 7, 9, 11);

$inx = binarySearch($arr, 1);

var_dump($inx);

1.冒泡排序

理解 $arr[0] 要与后面$a[1]到$[7] 比较 ,即数组的每一位都要后面剩下的下标元素比较,而不与前面下标的数组元素比较才能全部比较到

所以每一次循环次数都是 $arr[0] 需要比较 7 次 , $arra[1] 要比较 6次 ,所以 里面的for循环是 $num-$i-1;当然这是算循环次数,

不是程序真正运行的算法,按结果是一样的,数组中每个下标元素,都要与其他下标元素的比较到,

最简单的思考就是我们不管比较结果,只算比较次数,就好比下标就是篮子 里面有什么我们不管就是跟其他篮子比较,

结果给别人记录,比较那个人也给你排好顺序了,这就是比较最少次数,提高效率,比较容易理解

这个就好比一排人站成一队,只能跟身边的人两两从头到尾依次前小后大的原则互换

1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2、   对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3、   针对所有的元素重复以上的步骤,除了最后一个。

4、   持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

//1. 冒泡排序

$arr =[1,5,2,8,4,3,6,7];

bubbleSort($arr);

function bubbleSort($arr){

$num = count($arr);

for($i=0; $i

for($j=0; $j < $num-$i-1;$j++){

if($arr[$j] < $arr[$j+1]){

$tmp = $arr[$j];

$arr[$j] =$arr[$j+1] ;

$arr[$j+1] = $tmp;

}

}

}

print_r($arr);

}

2. 选择排序

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。

首先在未排序序列中找到最小元素,存放到排序序列的起始位置,

然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

这个排序法就是,假设数组中第一元素是最小的开始,

然后跟后面元素比较、找出最小值放到这个位置,然后再假设第二个位置最小,以此类推;

这个就好比一排人站成一队,先随机选一个跟其他的比较选出最小的放到位置上,

$arr =[1,5,2,8,4,3,6,7];

selectSort($arr);

function selectSort($arr){

$len = count($arr);

//$len-1 是最后一个不用循环了

for($i=0;$i

$min_key = $i; //假设这个是最小值的下标

//$i+1 是因为跟下个下标元素比较 所以不能从$j=0开始

for($j=$i+1;$j

//取出最小值、再往下比较

if($arr[$min_key] > $arr[$j]){

//比较值,取最小值下标

$min_key = $j;

}

}

//循环完、就将最小的值取出来给$i 下标的元素

if($min_key != $i) {

$tmp = $arr[$min_key];

$arr[$min_key] = $arr[$i];

$arr[$i] = $tmp;

}

}

print_r($arr);

}

(2)选择排序变种(我自己写的没有排序的名字,感觉跟选择排序一个道理)

假设 数组的下标顺序就是想要的顺序,取相应的值按下标摆放 这个就好比一排人站成一队,从第一个开始出队跟剩下的人从头到尾 遇到小的就互换值;

$arr =[1,5,2,8,4,3,6,7];

changeSort($arr);

function changeSort($arr){

$len = count($arr);

//$len-1 是最后一个不用循环了

for($i=0;$i

$min_key = $i; //假设这个是最小值的下标

//$i+1 是因为跟下个下标元素比较 所以不能从$j=0开始

for($j=$i+1;$j

//取出最小值、再往下比较

if($arr[$i] > $arr[$j]){

//比较值,遇到小的就互换值

list($arr[$i],$arr[$j]) = array($arr[$j],$arr[$i]);//list()=array();数组为变量赋值

}

}

//循环完、就将最小的值取出来给$i 下标的元素

}

print_r($arr);

}

3.插入排序法

(1)、从第一个元素开始,该元素可以认为已经被排序

(2)、取出下一个元素,在已经排序的元素序列中从后向前扫描

(3)、如果该元素(已排序)大于新元素,将该元素移到下一位置

(4)、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置

(5)、将新元素插入到该位置中

(6)、重复步骤2

第一个数组元素已被排好序,下标为0 , 把剩下的元素依据下个下标、拿出来跟它比,值比他小就换下位置,站入列队中,小在前大在后

一队人 第一个一站好 ,剩下的按小的在前,大的在后依次插入

$arr =[1,5,2,8,4,3,6,7];

insertSort($arr);

function insertSort($arr){

$len =count($arr);

for($i=1 ;$i

$tmp = $arr[$i];

for($j=$i-1;$j>=0;$j--){

//跟排好序的比,比最大的都大那就跳出不比了,直接入队,若小则在跟前面的比较

if($tmp >=$arr[$j]){

break;

}else{

$arr[$j+1] = $arr[$j];

$arr[$j] = $tmp;

}

}

}

print_r($arr);

}

4.快速排序(跟二叉树很像)

好比一队人分小组站好队,在集体加入队列站队 , 小的在左面,大的在右面

1、从数列中挑出一个元素,称为 “基准”(pivot),

2、重新排序数列,所有元素比基准值小的摆放在基准前面,

所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。

在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。

3、递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

$arr =[1,5,2,8,4,3,6,7];

print_r(quickSort($arr));

function quickSort($arr){

$left=$right=array();

$len = count($arr);

if($len <= 1) return $arr;

for($i=1;$i

if($arr[$i] < $arr[0]){

$left[] = $arr[$i];

}else{

$right[]=$arr[$i];

}

}

$left = quickSort($left);

$right =quickSort($right);

return array_merge($left,array($arr[0]),$right);

}

5.二叉树(这是一个简单的二叉树)

class tree{

public $root;

public $left;

public $right;

}

function to_array($obj){

$print_arr=array();

$tmp_arr = array();

array_unshift($tmp_arr,$obj);

while(!empty($tmp_arr)){

$data = array_pop($tmp_arr);

$print_arr[] = $data->root;

if($data->left !=null){

array_unshift($tmp_arr,$data->left);

}

if($data->right !=null){

array_unshift($tmp_arr,$data->right);

}

}

return $print_arr;

}

$root = new tree();

$node1 = new tree();

$node2 = new tree();

$node3 = new tree();

$node4 = new tree();

$node5 = new tree();

$node6 = new tree();

$root->root = 1;

$node1->root = 2;

$node2->root = 3;

$node3->root = 4;

$node4->root = 5;

$node5->root = 6;

$node6->root = 7;

$root->left = $node1;

$root->right = $node2;

$node1->left = $node3;

$node1->right = $node4;

$node2->left = $node5;

$node2->right = $node6;

echo "

";

print_r($root);

$traverse = to_array($root);

print_r($traverse);

注释:以上这些是我自己学习用的,不太权威哟,错了不管哟

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值