博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
php排序笔记-冒泡-选择-插入-希尔-堆排序
阅读量:5332 次
发布时间:2019-06-15

本文共 2630 字,大约阅读时间需要 8 分钟。

个人笔记,仅为记录个人代码。里边的打印和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;}
 

 

 
 
 
 

转载于:https://www.cnblogs.com/liyante/p/11095740.html

你可能感兴趣的文章
CAD&CG GDC 2018大会论文录用名单
查看>>
Mac 中文输入法失效(不显示选词框)解决办法
查看>>
基于 Laravel 开发博客应用系列 —— 设置 Linux/Mac 本地开发环境
查看>>
C语言基础-第五章
查看>>
CSS的一些命名
查看>>
[LeetCode]Valid Sudoku
查看>>
[leetcode]110BalancedBinaryTree平衡二叉树
查看>>
SQL中INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN区别
查看>>
学计算机的你伤不起啊
查看>>
Django+MongoDB批量插入数据
查看>>
GPS坐标换算为百度坐标
查看>>
Linux命令整理-Ubuntu
查看>>
liunx 安装和解压命令
查看>>
【问题解决】线程间操作无效:从不是创建控件“textBox1”的线程访问它
查看>>
Ralink RT3290无线网卡驱动安装 (linux)
查看>>
leetcode38. 报数
查看>>
ava集合框架
查看>>
把sublime text2配置的更好用,用到一点写一点
查看>>
构建之法阅读笔记02
查看>>
nodejs,python,sublime和Eclipse的包管理器
查看>>