php算--------法

<?php
//冒泡排序:两两交换数值,最小的值在最左边,就如最轻的气泡在最上边。对整列数两两交换一次
//最小的数在最左边,每次都能得一个在剩下的数中的最小 的数
//“冒”出来的数组成一个有序区间,剩下的值组成一无序区间,且有序区间中每一元素值都比无序区间的小
//快速排序:基准数,左右二个数组,递归调用,合并
//插入排序:排序区间分成二部分,左边有序,右边无序,从右区间取 第一个元素插入左区间若此元素比左边区间最右边的元素大,
留在原处,若此元素比左 边区间最右边的元素小,则插在最右边元素的原位置,同时最右边元素右移一位,计算器减一,重新和前面的元素比较,直到前面的元素比要插入元素小为止,重复 上述步骤。

//菱形
for($i=0;$i<=3;$i++){
echo str_repeat(" ",3-$i);
echo str_repeat("*",$i*2+1);
echo '<br/>';
}
//冒泡
$arr = array(1,3,5,32,756,2,6);
$len = count($arr);
////print_r($len);die;
////这题从小到大,第一轮排最小,第二轮排第二小,第三轮排第三小,依次类推……
for($i=0;$i<$len-1;$i++){
for($j=$i+1;$j<$len;$j++) {
if ($arr[$i] > $arr[$j]) {//从小到大
$p = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $p;
}
}
}
print_r($arr);


//在一组数中,要求插入一个数,按其原来顺序插入,维护原来排序方式
//思路:找到比要插入数大的那个位置,替换,然后把后面的数后移一位

//方法一
$in = 2;
$arr = array(1,1,1,3,5,7);
$n = count($arr);
//如果要插入的数已经最大,直接打印
if($arr[$n-1] < $in) {
$arr[$n+1] = $in; //print_r($arr);
}
for($i=0; $i<$n; $i++) {
//找出要插入的位置
if($arr[$i] >= $in){
$t1= $arr[$i];
$arr[$i] = $in;
//把后面的数据后移一位
for($j=$i+1; $j<$n+1; $j++) {
$t2 = $arr[$j];
$arr[$j] = $t1;
$t1 = $t2;
}
//打印
print_r($arr);
die;
}
}

//方法二

$in = 2;
$arr = array(1,1,1,3,5,7);
array_unshift($arr,$in);
$len=count($arr);
for($i=0;$i<$len-1;$i++){
for($j=$i+1;$j<$len;$j++) {
if ($arr[$i] > $arr[$j]) {//从小到大
$p = $arr[$i];
$arr[$i] = $arr[$j];
$arr[$j] = $p;
}
}
}
print_r($arr);

//快速排序
//通过排序分成两部分,然后递归对这两部分排序,最后合并
function q($array) {
if (count($array) <= 1) {return $array;}
//以$key为界,分成两个子数组
$key = $array[0];
$l = array();
$r = array();
//分别进行递归排序,然后合成一个数组
for ($i=1; $i<count($array); $i++) {
if ($array[$i] <= $key) { $l[] = $array[$i]; }
else { $r[] = $array[$i]; }
}
$l = q($l);
$r = q($r);
return array_merge($l, array($key), $r);
}
$arr = array(1,2,44,3,4,33);
print_r( q($arr) );

//二分查找算法
//以数组中某个值为界,再递归进行查找,直到结束
function find($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return find($array, $low, $mid-1, $k);
}else{
return find($array, $mid+1, $high, $k);
}
}
die('Not have...');
}
$array = array(2,4,3,5);
$n = count($array);
$r = find($array,0,$n,5);


//array_merge()妙用
function t(){
$c = func_num_args()-1;
$a = func_get_args();
//print_r($a);
for($i=0; $i<=$c; $i++){
if(is_array($a[$i])){
for($j=0; $j<count($a[$i]); $j++){
$r[] = $a[$i][$j];
}
} else {
die('Not a array!');
}
}
return $r;
}
//test
print_r(t(range(1,4),range(1,4),range(1,4)));
echo '<br/>';
$a = array_merge(range(1,4),range(1,4),range(1,4));
print_r($a);


// 插入排序
$data = array(6,13,21,99,18,2,25,33,19,84);
$nums = count($data)-1;
dump( $data );
InsertionSort($data,$nums);
dump( $data );
function InsertionSort(& $arr,$n )
{
for( $i=1; $i<=$n; $i++ )
{
$tmp = $arr[$i];
for( $j = $i; $j>0 && $arr[$j-1]>$tmp; $j-- )
{
$arr[$j] = $arr[$j-1];
}
$arr[$j] = $tmp;
}
}
function dump( $d )
{
echo '<pre>';print_r($d);echo '</pre>';
}


//希尔排序
$data = array(6,13,21,99,18,2,25,33,19,84);
$nums = count($data);
dump( $data );
ShellSort($data,$nums);
dump( $data );
function ShellSort(& $arr,$n )
{
for( $increment = intval($n/2); $increment > 0; $increment = intval($increment/2) )
{
for( $i=$increment; $i<$n; $i++ )
{
$tmp = $arr[$i];
for( $j = $i; $j>= $increment; $j -= $increment )
if( $tmp < $arr[ $j-$increment ] )
$arr[$j] = $arr[$j-$increment];
else
break;
$arr[$j] = $tmp;
}
}
}



//快速排序
$data = array(6,13,21,99,18,2,25,33,19,84);
dump($data);
quicks($data,0,count($data)-1);
dump($data);
function QuickSort(& $arr,$left,$right)
{
$l = $left;
$r = $right;
$pivot = intval(($r+$l)/2);
$p = $arr[$pivot];
do
{
while(($arr[$l] < $p) && ($l < $right))
$l++;
while(($arr[$r] > $p) && ($r > $left))
$r--;
if($l <= $r)
{
$temp = $arr[$l];
$arr[$l] = $arr[$r];
$arr[$r] = $temp;
$l++;
$r--;
}
}
while($l <= $r);
if($left < $r)
QuickSort(&$arr,$left,$r);
if($l < $right)
QuickSort(&$arr,$l,$right);
}


posted on 2017-08-29 09:49  骄傲做自己  阅读(194)  评论(0编辑  收藏  举报

导航