个人笔记,仅为记录个人代码。里边的打印和sleep只为看到代码排序过程。如有错误请指正。
$arr = [3,4,6,1,7,8,9,5,10,2];
//冒泡 两两比较,大的在前,则交换位置。变成小的在前
$max = count($arr)-1;
$flag = true;
for($i=0;$i<$max && $flag;$i++){
$flag = false;
for($j=$max-$i;$j>0;$j--){
if($arr[$j]<$arr[$j-1]){
$tmp = $arr[$j-1];
$arr[$j-1]=$arr[$j];
$arr[$j]=$tmp;
$flag = true;
}
echo $i.'次'.PHP_EOL;
var_dump($arr).PHP_EOL;
sleep(1);
}
}
//选择排序 从第一个开始扫描,选择一个最小的放前面。
for($i=0;$i<$max;$i++){
$min = $arr[$i];
for($j=$i+1;$j<$max;$j++){
if($arr[$j]<$min){
$min = $arr[$j];
$arr[$j]=$arr[$i];
$arr[$i]=$min;
}
var_dump($arr).PHP_EOL;
}
sleep(1);
}
//插入排序,从第二个数开始,和前面的数比较,如果比前面的数小,则前面所有的数都往后移动,将小的数插入到前面。
$max = count($arr);
for($i=1;$i<$max;$i++){
if($arr[$i-1]>$arr[$i]){
$tmp = $arr[$i];
for($j=$i-1;$j>=0 && $arr[$j]>$tmp;$j--){
$arr[$j+1]=$arr[$j];
$arr[$j]=$tmp;
}
var_dump($arr).PHP_EOL;
sleep(1);
}
}
//希尔排序,取一个分量,然后再进行插入排序。
public function shellSort($arr){
$total = count($arr);
$inc = $total;
do{
$inc = ceil($inc/2);
for($i=$inc;$i<$total;$i++){
if($arr[$i-$inc]>$arr[$i]){
$tmp = $arr[$i];
for($j=$i-$inc;$j>=0 && $arr[$j]>$tmp;$j-=$inc){
$arr[$j+$inc]=$arr[$j];
$arr[$j]=$tmp;
}
var_dump($arr).PHP_EOL;
sleep(1);
}
}
}while($inc>1);
return $arr;
}
//堆排序 每次取最大值放到顶端,然后再和最小的叶节点进行调换。相当于每次取出一个最大值放到最后。
public function heapSort(){
$arr = [3,4,6,1,7,8,9,5,10,2];
$total = count($arr);
//其实这个循环就是每次将 比父节点大的子节点数值 和父节点进行交换。最终将最大值放到最顶端
for($i=$total/2-1;$i>=0;$i--){
$this->adjustHeap($arr,$i,$total);
}
//将最顶端的最大值,和最小叶节点交换,并且下次循环不再将最小叶节点放到循环内。然后再次将剩余的最大数值调换到最顶端。
for($j=$total-1;$j>0;$j--){
$this->swap($arr,0,$j);
$this->adjustHeap($arr,0,$j);
}
}
public function adjustHeap(&$arr,$i,$total){
$tmp = $arr[$i];
//从i节点的做节点开始,也就是i*2+1;
for($k=$i*2+1;$k<$total;$k=$k*2+1){
//如果左节点小于右节点,则将k指向右节点
if($k+1<$total && $arr[$k]<$arr[$k+1]){
$k++;
}
//如果当前节点大于父节点,则将此节点的数值赋值给父节点,且不交换。只进行赋值,并且将k赋值给i,也就是i现在是原来k的位置。待退出循环后,将之前的tmp赋值给后面的i的位置,
if($arr[$k]>$tmp){
$arr[$i]=$arr[$k];
$i=$k;
}
}
$arr[$i]=$tmp;
}
public function swap(&$arr,$a,$b){
$tmp =$arr[$a];
$arr[$a]=$arr[$b];
$arr[$b]=$tmp;
var_dump($arr).PHP_EOL;
}