QQ:15624575
/*
*算法要求:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。
*例如输入数组{32, 321},则输出这两个能排成的最小数字32132。
*请给出解决问题的算法,并证明该算法。
*
*算法分析:要从2个以上数字中,得到所能排出的最小数,比较复杂。但是如果只有2个数,就好比较了。
*我们的方法就是:将整个分成2部分,第一部分是从第一个元素到倒数第二个元素;第二部分是最后一个元素。
*如果我们得到了第一部分能排出的最小数,那么整个数组所能排出的最小数就可以得到了。没错,大家一看就
*知道了,这里我们要用递归思想。先得出数组中前2个数,所能排出的最小数,然后将原数组中前2个数弹出数组,
*将前2个排出的最小数压入到数组的最前面,得到一个新的数组,然后再重复前面的过程。
*/
$array=array(11,0,33,441,34,9,19);
echo '得到的最小数是:'.get_min_num($array,count($array));
function get_min_num($array,$num){
if($num==1){//如果只有一个元素,直接输出
return $array[0];
}else if($num==2){//如果有2个元素,得到最小的数
$min=get_min_two($array);
return $min;//返回排出的最小数
}else if($num>2){//如果元素大于2
$min=get_min_two($array);//得到前2个元素组合的最小数
array_shift($array);//将第一个元素弹出数组
array_shift($array);//将第二个元素弹出数组
array_unshift($array,$min);//将前2个数得到的最小数压入到数组最前面
return get_min_num($array,count($array));//递归返回
}
}
function get_min_two($array){
$ff=substr($array[0],0,1);//得到数组第一个元素的最高位数字
$ss=substr($array[1],0,1);//得到数组第二个元素的最高位数字
if($ff
$min=$array[0].$array[1];//那么最小的数就是第一个数连接第二个数
}else if($ff
$min=$array[1];//那么最小的数就是第二个元素,忽略形如'01'这样的字符串
}else if($ff>$ss&&$ss){//如果第一个元素的最高位大于第二个元素的最高位
$min=$array[1].$array[0];//那么最小的数就是第二个数连接第一个数
}else if($ff>$ss&&!$ss){//如果第一个元素的最高位小于第二个元素的最高位,但是第二个元素为0
$min=$array[0];//那么最小的数就是第一个元素,忽略形如'01'这样的字符串
}else if($ff==$ss){//如果第一个元素的最高位等于第二个元素的最高位
$fl=substr($array[0],-1);//得到数组第一个元素的最低位数字
$sl=substr($array[1],-1);//得到数组第二个元素的最低位数字
if($fl
$min=$array[0].$array[1];//那么最小的数就是第一个数连接第二个数
}else if($fl>$sl){//如果第一个元素的最低位大于第二个元素的最低位
$min=$array[1].$array[0];//那么最小的数就是第二个数连接第一个数
}else if($fl==$sl){//如果第一个元素的最低位等于第二个元素的最低位
$min1=$array[0].$array[1];
$min2=$array[1].$array[0];
if($min1>=$min2)
$min=$min2;
else
$min=$min1;
}
}
return $min;
}
?>