数组的排序
这里介绍一些常用的排序方法,排序是一个程序员的基本功
所谓排序就是对一组数据,按照某个顺序排列的过程
排序分2大类:
内部排序
交换式排序法
1 ,冒泡法
快速体验:
<?php
$arr = array (0, 5, - 1 );
//从小到大排
$temp = 0;
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;
}
}
}
print_r ( $arr );
?>
扩展:为了更好的使用排序,我们将其封装成一个函数
代码如下:
<?php
//现在我们把冒泡法封装成函数,利于以后使用。
function bubbleSort($myarr) {
$temp = 0;
for($i = 0; $i < count ( $myarr ) - 1; $i ++) {
for($j = 0; $j < count ( $myarr ) - 1 - $i; $j ++) {
if ($myarr [$j] > $myarr [$j + 1]) {
$temp = $myarr [$j];
$myarr [$j] = $myarr [$j + 1];
$myarr [$j + 1] = $temp;
}
}
}
}
$arr = array (0, 5, - 1 );
//从小到大排
//使用函数去排序
bubbleSort ( $arr );
print_r ( $arr );
?>
结果没有变化???
分析原因:
改进后:
<?php
//现在我们把冒泡法封装成函数,利于以后使用
function bubbleSort(&$myarr) {
//加了个地址符&
$temp = 0;
for($i = 0; $i < count ( $myarr ) - 1; $i ++) {
for($j = 0; $j < count ( $myarr ) - 1 - $i; $j ++) {
if ($myarr [$j] > $myarr [$j + 1]) {
$temp = $myarr [$j];
$myarr [$j] = $myarr [$j + 1];
$myarr [$j + 1] = $temp;
}
}
}
echo "<br/>函数中的myarr数组";
print_r ( $myarr );
}
$arr = array (0, 5, - 1 );
//从小到大排
//使用函数去排序
bubbleSort ( $arr );
print_r ( $arr );
?>
☞☞☞小结论:
数组默认传递的是值,不是地址
2,选择排序法
案例:
<?php
function selectSort(&$arr){
$temp = 0;
for($i = 0; $i < count ( $arr ) - 1; $i ++){
//假设$i是最小的数
$minVal = $arr [$i];
//记录我认为的最小数的下标
$minIndex = $i;
for($j = $i + 1; $j < count ( $arr ); $j ++){
//说明我们认为的最小值,不是最小
if ($minVal > $arr [$j]) {
$minVal = $arr [$j];
$minIndex = $j;
}
}
//最后交换
$temp = $arr [$i];
$arr [$i] = $arr [$minIndex];
$arr [$minIndex] = $temp;
}
}
$arr = array (0, 5, - 1 );
//从小到大排
//使用函数去排序
selectSort ( $arr );
print_r ( $arr );
?>
3,插入排序法
<?php
//小到大排
function insertSort(&$arr){
//先默认下标为0,这个数已经是有序的了
for($i = 1; $i < count ( $arr ); $i ++) {
//$insertVal是准备插入的数
$insertVal = $arr [$i];
//准备先和下标为$insertIndex的数比较
$insertIndex = $i - 1;
//如果这个条件满足,说明,我们还没有找到适当的位置。
while ( $insertIndex >= 0 && $insertVal < $arr [$insertIndex] ){
//同时把数后移
$arr [$insertIndex + 1] = $arr [$insertIndex];
$insertIndex --;
} //插入(这是就给$insertVal找到位置了)
$arr [$insertIndex + 1] = $insertVal;
}
}
$arr = array (0, 5, - 1 );
insertSort ( $arr );
print_r ( $arr );
?>
4,快速排序法(php程序员不做要求)
从效率上看,(效率 时间和空间上看)
冒泡法<选择排序法<插入排序法
快速排序法【空间和时间协调】
现在更关心时间问题了,更接近于用空间来换取时间了
外部排序
因为数据量大,必须借助外部文件来完成
扩展:
1,工作2,3年后,可以研究:
基础得扎实(长远来看)
研究linux内核
研究算法
研究网络技术
研究数据库
高级的架构师是没有问题的
2,打出系统的当前时间
date_default_timezone_set('Asia/Shanghai');
$today= date('y-n-d G:i:s');
echo $today;
3,动态创建200000个数
<?php
//动态的创建200000个数据
$arr=array();
for($i=0;$i<20;$i++){
$arr[$i]=rand(0,3000);
//200000*4=800000
echo $arr[$i]."<br/>";
}
?>
4,优化冒泡排序
小小的优化,带来效率的提升
<?php
//现在我们把冒泡法封装成函数,利于以后使用
function bubbleSort(&$myarr) {
$temp = 0;
$flag = false; //默认没有进来
for($i = 0; $i < count ( $myarr ) - 1; $i ++) {
for($j = 0; $j < count ( $myarr ) - 1 - $i; $j ++) {
if ($myarr [$j] > $myarr [$j + 1]) {
$temp = $myarr [$j];
$myarr [$j] = $myarr [$j + 1];
$myarr [$j + 1] = $temp;
$flag = true;
//进来后,就为true了,
}
}
//判断
if (! $flag) {
//已经是有序的
break;
}
$flag = false;
}
echo "<br/>函数中的myarr数组";
print_r ( $myarr );
}
$arr = array (0, 5, - 1 );
//从小到大排
//使用函数去排序
bubbleSort ( $arr );
print_r ( $arr );
?>
查找
介绍2种
1,顺序查找
对某个数组,按照顺序,一个一个比较,然后找到你想要的数据
案例:
要求从一个数组中查找到一个数,如果找到,则输出该数的下标,若找不到,则输出,查无此数
<?php
function search(&$arr, $findVal) {
$flag = false;
for($i = 0; $i < count ( $arr ); $i ++) {
if ($findVal == $arr [$i]) {
echo "找到了,下标为$i<br/>";
$flag = true;
//break;
}
}
if (! $flag) {
echo '查询不到';
}
}
$arr = array (2.2, 0, 4, 0 );
search ( $arr, 0 );
?>
2,二分查找(必须要掌握的)
所谓二分查找,它有一个重要的前提,该数组本身,已经是一个有序数组,
如果该数组不是有序的,则必须先排序再查找
思想:
<?php
//二分查找
function binarySearch(&$arr, $findVal, $leftIndex, $rightIndex) {
//
//当$rightIndex>$leftIndex,说明没有数
if ($rightIndex < $leftIndex) {
echo "找不到该数";
return;
}
//找到中间这个数,
$middleIndex = round ( ($rightIndex + $leftIndex) / 2 );
//如果是大于,则向后面找。
if ($findVal > $arr [$middleIndex]) {
binarySearch ( $arr, $findVal, $middleIndex + 1, $rightIndex );
} //如果是小于,则向前面找。
else if ($findVal < $arr [$middleIndex]) {
binarySearch ( $arr, $findVal, $leftIndex, $middleIndex - 1 );
} else {
echo "找到这个数,下标是$middleIndex";
}
}
$arr = array (- 2, 0, 4, 5 );
binarySearch ( $arr, 5, 0, count ( $arr ) - 1 );
?>