参考:
http://zh.wikipedia.org/wiki/冒泡排序
冒泡排序
目标:将下列数组进行正序(从小到大)排列出来
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性逻辑描述:
1,对该数组从第一个元素开始,从左到右,相邻的2个元素比较大小:如果左边的比右边的大,则将他们俩交换位置,结果:
array( 5, 15, 3, 4, 9, 11);(原始)
array( 5, 15, 3, 4, 9, 11);
array( 5, 3, 15, 4, 9, 11);
array( 5, 3, 4, 15, 9, 11);
array( 5, 3, 4, 9, 15, 11);
array( 5, 3, 4, 9, 11, 15);
此时,才“走完一轮回”,继续下一轮:
array( 5, 3, 4, 9, 11, 15);(初始)
array( 3 5, 4, 9, 11, 15);
array( 3 4, 5 9, 11, 15);
array( 3 4, 5 9, 11, 15);
array( 3 4, 5 9, 11, 15);
继续下一轮:
array( 3 4, 5 9, 11, 15);
。。。。。。。。
隐含的逻辑描述(假设数组有n项):
1, 需要进行n-1趟的“冒泡”比较过程。
2, 每一趟的比较都前一趟少比一次,第一趟需要比较n-1次
3, 每趟比较,都是从数组的开头(0)开始,跟紧挨的元素比较,并进行交换(需要的时候)
//DEMO
$arr = array(5,20,3,4,9,10);
$len = count($arr);
////要进行找出最大值所在项的趟数,需要进行n-1次的冒泡比较
for($i=0;$i<$len-1;$i++){//设定比较的次数
//每一次比前一次少一次,第一次要比较n-1
for($j=0;$j<$len-1-$i;$j++){
//这里要实现下标为$j和$j+1的比较
if($arr[$j] >$arr[$j+1]){
$a1 = $arr[$j];
$a2 = $arr[$j+1];
$arr[$j] =$a2;
$arr[$j+1] = $a1;
}
}
}
print_R($arr);
选择排序
目标:将下列数组进行正序(从小到大)排列出来
$arr2 = array( 5, 15, 3, 4, 9, 11);
一般性逻辑描述:
第1趟:取得该数组中的最大值及其下标,然后跟该数组的最后一项“交换”(倒数第1项确定)
第2趟:取得该数组中除最后1项中的最大值及其下标,然后跟倒数第2项交换(倒数第2项确定)
第3趟:取得该数组中除最后2项中的最大值及其下标,然后跟倒数第3项交换(倒数第3项确定)
。。。。。。
隐含的逻辑描述(假设数组有n项):
1,要进行n-1趟才可能得出结论
2,每一趟要找的数据的个数都比前一趟少一个,第1趟要找n个
3,每次找出的最大值所在的项,和要与之进行交换的项的位置,依次减1,第一次的位置n-1
DEMO:
//DEMO
$arr = array( 5, 15, 3, 4, 9, 11);
$len = count($arr);
//要进行找出最大值所在项的趟数
for($i = 0; $i < $len-1; ++$i){ //设定比较的趟数
$max_val = $arr[0]; //取得第一项,并以之当作存储最大值的变量
$max_key = 0; //取得第一项的下标,并当作存储最大值对应下标的变量
for($k = 0; $k < $len-$i; ++$k){
//这里开始对从0到$len-$i这些元素进行“找最大值及其下标”
if($arr[$k] > $max_val){
$max_val = $arr[$k]; //存储最大值
$max_key = $k; //并同时存储对应下标
}
}
//开始做交换(只有循环结束后,才可以确定最大值及其下标):
$a1 = $arr[$max_key];
$a2 = $arr[$len-1-$i];
$arr[$max_key] = $a2;//$len-1-$i就是“当前查找数据的最后一个位置”
$arr[$len-1-$i] = $a1;
}
print_r($arr);
//DEMO
//二分查找思想:
//目标:找一个数据(31)在该数组中的位置
$v1 = 15;
$arr2 = array( 3, 4, 5, 15, 19, 21, 25, 30, 30, 30, 33, 38, 44, 51, 52, 55, 60, 77, 80, 82, 83);
//$arr: 要从中找数据的数组
//$v: 要找的数据
//$start: 要从该数组中查找的开始位置
//$start: 要从该数组中查找的结尾位置
function binary_search($arr, $v, $start, $end){
if($start > $end)return false;
$mid = floor(($start + $end)/2); //计算出中间项的位置
if($v == $arr[$mid]){
return $mid; //千恩万谢,第一次就找到了
}
else if($v < $arr[$mid]){ //此时就只要去“左边那一半”找了
$start = $start; //左边位置还是左边位置
$end = $mid - 1; //右边位置就应该是$mid - 1;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
else{
$start = $mid + 1; //左边位置就应该是$mid + 1
$end = $end; //右边位置还是右边位置;
//if($start > $end)return false;
return binary_search($arr, $v, $start, $end);
}
}
$len = count($arr2);
$result = binary_search($arr2, $v1, 0, $len-1);
if($result === false){
echo "没找到";
}
else{
echo "位置为:$result";
}
//--------------------
// 基本数据结构算法
//--------------------
//二分查找(数组里查找某个元素)
function bin_sch($array, $low, $high, $k){
if ($low <= $high){
$mid = intval(($low+$high)/2);
if ($array[$mid] == $k){
return $mid;
}elseif ($k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+1, $high, $k);
}
}
return -1;
}
//顺序查找(数组里查找某个元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if($array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
//线性表的删除(数组中实现)
function delete_array_element($array, $i)
{
$len = count($array);
for ($j=$i; $j<$len; $j++){
$array[$j] = $array[$j+1];
}
array_pop($array);
return $array;
}
//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j--){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(数组排序)
function quick_sort($array) {
if (count($array) <= 1) return $array;
$key = $array[0];
$left_arr = array();
$right_arr = array();
for ($i=1; $i
demo:
$test=array(221,332,666,844,222,711);
//数组排序正向
function BubbleSort(&$arr){
$flag=1;
for($i=0;$i$arr[$j+1]){
$tmp=$arr[$j];
$arr[$j]=$arr[$j+1];
$arr[$j+1]=$tmp;
$flag=1;
}
}
}
}
BubbleSort($test);
print_r($test);
//冒泡排序
function maopao($arr) {
$count = count($arr);
for($i=0; $i<$count-1; ++$i) {
for($j=0; $j<$count-$i-1; ++$j) {
if($arr[$j] > $arr[$j+1]) {
$temp = $arr[$j];
$arr[$j] = $arr[$j+1];
$arr[$j+1] = $temp;
}
}
}
return $arr;
}
//冒泡排序(数组排序)
function bubble_sort($array)
{
$count = count($array);
if ($count <= 0) return false;
for($i=0; $i<$count; $i++){
for($j=$count-1; $j>$i; $j–){
if ($array[$j] < $array[$j-1]){
$tmp = $array[$j];
$array[$j] = $array[$j-1];
$array[$j-1] = $tmp;
}
}
}
return $array;
}
//顺序排序
function shunxu($arr) {
$count = count($arr);
for($i=0; $i<$count-1; ++$i) {
$p = $i;
for($j=$i+1; $j<$count; ++$j) {
$p = $arr[$p] > $arr[$j] ? $j : $p;
}
if($p != $i) {
$tvalue = $arr[$i];
$arr[$i] = $arr[$p];
$arr[$p] = $tvalue;
}
}
return $arr;
}
//array_slice(array,start,length,true);//true - 保留键名;false默认。重置键名
$arr = array(
array(1,2,3,4,5,6),
array(11,2,3,4,5,6),
array(1,22,3,4,5,6),
array(1,2,33,4,5,6),
array(1,2,3,44,5,6),
array(1,2,3,4,55,6),
array(1,2,3,4,5,66),
);
$n = array_slice($arr,0,2,true);
echo"";print_R($n);