标签:
交换函数:注意要按引用传递,否则无法真正交换两个数的值
function exchange(&$a, &$b){
$temp = $a;
$a = $b;
$b = $temp;
}
1、直接插入算法
//第一种实现
function insert_sort($arr){
for ($i = 0; $i < count($arr)-1; $i++){
for($j = $i+1; $j > 0; $j--){
if($arr[$j] > $arr[$j-1]){
exchage($arr[$j], $arr[$j-1]);
}
}
}
return $arr;
}
//第二种实现
function insert_sort($arr){
for ($i = 0; $i < count($arr)-1; $i++){
$j = $i + 1;
while($j > 0){
if($arr[$j] > $arr[$j-1]){
exchage($arr[$j], $arr[$j-1]);
}
$j--;
}
}
return $arr;
}
2、希尔排序算法【暂缺】
3、直接选择排序算法
function select_sort($arr){
for($i = 0; $i < count($arr); $i++){
$key = $arr[$i];
$n = $i;
for($j = $i+1; $j < count($arr); $j++){
if($key > $arr[$j]){
$key = $arr[$j];
$n = $j;
}
}
$arr[$n] = $arr[$i];
$arr[$i] = $key;
}
return $arr;
}
4、堆排序算法【暂缺】
5、冒泡排序算法
//第一种
function bubble_sort($arr){
for($i = 0; $i < count($arr)-1; $i++){
for($j = count($arr)-1; $j > $i; $j--){
if($arr[$j-1] < $arr[$j]){
exchage($arr[$j], $arr[$j-1]);
}
}
}
return $arr;
}
//第二种
function bubble_sort($arr){
for($i = 0; $i < count($arr)-1; $i++){
$j = 0;
while($j < count($arr)-1-$i){
if($arr[$j] < $arr[$j+1]){
exchage($arr[$j], $arr[$j-1]);
}
$j++;
}
}
return $arr;
}
6、快速排序算法
function quick_sort(&$arr, $p, $r){
if($p < $r){
$q = partition($arr, $p, $r);
quick_sort($arr, $p, $q-1);
quick_sort($arr, $q+1, $r);
}
}
function partition(&$arr, $p, $r){
$i = rand($p, $r); //实现随机化快排
exchange($arr[$i], $arr[$r]);
$n=$p-1;
for($m = $p; $m < $r; $m++){
if($arr[$m] < $arr[$r]){
++$n;
exchange($arr[$m], $arr[$n]);
}
}
exchange($arr[$n+1], $arr[$r]);
return $n+1; //n位上的元素,一经排序,则已固定
}
7、归并排序算法【注意:数组按值传输】
function merge_sort(&$A, $p, $r){
if($p < $r){
$q = floor(($p + $r)/2);
merge_sort($A, $p, $q);
merge_sort($A, $q+1, $r);
merge($A, $p, $q, $r);
}
}
//第一种
function merge(&$A, $p, $q, $r){ //哨兵牌法
$n1 = $q - $p + 1;
$n2 = $r - $q;
for($i = 0; $i < $n1; $i++){
$L[$i] = $A[$p+$i];
}
for($j = 0; $j < $n2; $j++){
$R[$j] = $A[$q+$j+1];
}
//防止越界(哨兵)
$L[$n1] = $R[$n2] = PHP_INT_MAX;
$i = $j = 0;
for($k = $p; $k <= $r; $k++){
if($L[$i] <= $R[$j]){
$A[$k] = $L[$i];
$i++;
}else{
$A[$k] = $R[$j];
$j++;
}
}
}
//第二种
function merge(&$A, $p, $q, $r){
$n1 = $q - $p + 1;
$n2 = $r - $q;
for($i = 0; $i < $n1; $i++){
$L[$i] = $A[$p+$i];
}
for($j = 0; $j < $n2; $j++){
$R[$j] = $A[$q+$j+1];
}
$i = $j = 0;
$k = $p;
while($i
if($L[$i] <= $R[$j]){
$A[$k++] = $L[$i++];
}else{
$A[$k++] = $R[$j++];
}
}
for(; $i
$A[$k++] = $L[$i];
}
for(; $j
$A[$k++] = $R[$j];
}
}
8、基数排序算法【暂缺】
转载自:https://www.cnblogs.com/zixuanfy/p/7617451.html
标签:
来源: https://www.cnblogs.com/jierong12/p/10136242.html