php冒泡算法

1.冒泡算法

网上搜了很多,但是总是对于每次循环的边界值思路讲的比较笼统。不是很容易被新手记住,我自己平时也是硬记下来的。但是对于算法,硬记,时间长了还是容易忘记,所以自己写了一次,把每次思路尽量写下来,便于理解,理解了容易加深映像,不容易忘记了。

冒泡算法,核心就是

循环比对  每次比对相邻2个数组的大小,然后把最大的数组放到后面,这样所有比对循环一次,就会把数组中最大的数放到数组最后,

然后重复循环(重复上面的比对循环):此时循环的时候 最后一个值是不需要参加循环了,因为已经确定是最大的那个了。也就是说,重复循环,比对数组越来越少。最终只剩一个数组元素了。循环结束

代码层看,

$arr=array(5,4,3,6,7,1,2,10,8,9);

先从内层比对循环开始看

一般for循环 这么写

for($i=0;$i<$xx;$i++){

    if($arr[$i]>$arr[$i+1]){//相邻比较 这个应该比较容易理解吧
        $tem=$arr[$i];
        $arr[$i]=$arr[$i+1];
        $arr[$i+1]=$tem;
    }

}  

上面思路说了,每次循环都是从开头第一个元素开始 所以$i 起始值为0, 重复循环一次,下次循环就少比对一个元素。这里$xx要越来越小; 那这个$xx怎么确定呢?

首先我们来看下这个$xx边界值。

$xx第一次循环值是多少 是数组元素长度 count($arr)减 1  为什么呢?因为比对的时候 用到的$arr[$i+1] 。如果$xx等于数组长度,每次循环比对到最后的时候 $arr[$i+1] 就不存在了,也就是没法比对了

$xx 最后一次值该是多少呢? 是1, 循环到最后 只剩一个数组元素了。

也就是说 $xx  为  count($arr)-$k  $k是累加的 比对循环可改为(重复循环每循环一次)

for($i=0;$i<count($arr)-$k;$i++){

    if($arr[$i]>$arr[$i+1]){//相邻比较
        $tem=$arr[$i];
        $arr[$i]=$arr[$i+1];
        $arr[$i+1]=$tem;
    }

}  

再看这个$k 想想这个$k不就是随着重复循环在累增的吗? 把重复循环代码加上如下

 for($k=1;$k<count($arr);$k++){

        //对长度越来越少的一组数据 找出最大让其浮到最后

        for($i=0;$i<count($arr)-$k;$i++){

            if($arr[$i]>$arr[$i+1]){//相邻比较
                $tem=$arr[$i];
                $arr[$i]=$arr[$i+1];
                $arr[$i+1]=$tem;
            }

        }
    }

我们再来看下$k是怎么确定边界值的 上面说了, $xx 边界值是 count($arr)-1 到 1   已经定义  那么数学算法 $k边界值也就出来了 为 1到 count($arr)-1

写入到循环里也就是 $k=1;$k<count($arr);$k++了。

语言组织的还是不太完善,等晚点再来整理。

原文地址:https://www.cnblogs.com/phpjinggege/p/8257851.html

时间: 2024-08-04 22:51:59

php冒泡算法的相关文章

1014 C语言文法定义与C程序的推导过程 程序:冒泡算法C程序(语法树)

1014 C语言文法定义与C程序的推导过程  程序:冒泡算法C程序(语法树)1 阅读并理解提供给大家的C语言文法文件. 2 参考该文件写出一个自己好理解版的现实版的完整版的C语言文法. 3 给出一段C程序,画出用上述文法产生这段C程序的完整语法树. 程序:冒泡算法C程序 点此文字查看原图(完整图片) 1 #include <stdio.h> 2 3 main() 4 { 5 int i,j,temp; 6 int a[10]; 7 8 for(i=0;i<10;i++) 9 scanf

Python函数之冒泡算法

冒泡算法 1. data = [4,3,2,1] count = 0 for i in range(0, len(data)): #len(data)代表的是列表的总长度 #取外层函数的第一个值进行循环 for j in range(i + 1, len(data)): #把外层循环的第一个值跟所有的内层循环的值比较一遍,并跟换位置,沉低 count += 1 if data[j] < data[i]: tmp = data[j] data[j] = data[i] data[i] = tmp

阶乘求和与冒泡算法编程

编程题是写1!+2!+...+10!: 冒泡算法编程

python冒泡算法,lambda表达式

======================================================================== 冒泡算法 (个人理解类似于IP互换方案方式,或者被老师成为小鱼冒泡泡) 如何将列表内的数字进行排序呢? 方法1(需要递归) li =[5,4,3,2,6]                 #定义一个列表 print li                            #调试打印出列表 for m in range(4):          #通

关于冒泡算法

首先冒泡算法就是每次把最大的找出来,冒泡出去,但是有2种不同实现. 第一: public class Test12{     public static void main(String[] args){/*         int score[] = {67, 88, 45, 87, 29, 99, 109, 100};         for (int i = 0; i < score.length -1; i++){    //最多做n-1趟排序             for(int j

Python 第五篇:冒泡算法、系统标准模块

一:冒泡算法,也叫冒泡排序,其特点如下: 1.比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2.对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对.在这一点,最后的元素应该会是最大的数. 3.针对所有的元素重复以上的步骤,除了最后一个. 4.持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较. 使用python的冒泡排序完成一组无序队列的排序: data = [10,4,33,21,54,3,8,11,5,22,2,2,2,1,17,13,6] print(d

冒泡算法

冒泡算法基本思路: 对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序.可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较. 冒泡排序(Bubble Sort) 它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,

Python之冒泡算法

有如下列表,要求从左到右顺序排序 li = [13,22,6,99,11] 实现方法: li = [13,22,6,99,11]print "##########原始数字顺序################"print liprint "#########开始第一次排序############3"for m in range(4):    num1 = li[m]    num2 = li[m+1]    if num1>num2:       tmp = l

算法一:冒泡算法

所谓冒泡算法就是把排序想像成水里的水泡,小的在上面,大的在下面 相邻的两个元素比较,如果前面的比后面的大,就交换. 如有一组数据:3,6,2,1,9 ->3,2,1,6,9 ->2,1,3,6,9 ->1,2,3,6,9 int main() { int a[] = {3,6,2,1,9}; for (int i = 0; i < sizeof(a)/4; i++) { for (int j = 0; j < sizeof(a)/4 - i - 1; j++) { if (a

C#冒泡算法复习

冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,比较总数的n-1次(因为比较是2个双双比较的) 第一层循环表示进行比较的次数,总共要比较(数的)-1次 (因为比较是2个双双比较的) 第二层循环表示第几趟循环,趟数等于比较数-趟数(第二趟再少比较一次,因为第一趟后最小的在最后面了) using System; namespace test { class Program { public static void Main() { //冒泡算法的意思:每一趟找到一个最小或最大的数放到最后面,