使用PHP完成冒泡排序算法

原创 阁主  2020-06-20 19:06:36  阅读 3154 次 评论 0 条
摘要:

编程语言千千万,都离不开各种排序,比如比较典型的冒泡排序、快速排序、插入排序等,当然还有为之所动容的猴子排序、睡眠排序!!!本文只讲如何使用PHP实现冒泡排序的算法!

原理分析

本文使用的排序数组数据如下:

$arr1 = array(18,22,12, 15,23,9);

冒泡排序大致过程:大致遍历一个数组,在此过程中,将相邻的两个单元的值进行比较(俩俩大小相比,左边比右边大就对换位置)

第一趟:如果前面的比后面的大,则将两个值交换位置。这个过程到最后,数组中的最大值一定放在最后位置了。

第二趟:如果将上述过程再进行一遍,则又可以确定剩余数据中的最大值放在倒数第二的位置。

第三躺:然后将上述过程继续进行一遍,则可以继续确定剩余数据中的最大值放在倒数第三的位置。

第N趟:依次类推。。。。。。进行若干次,就排好了。

下方图中所示为上面所列举的算法过程:

排序过程.png

规律总结

1.要进行从头到尾两两比较并进行交换位置的趟数为$n-1趟,$n总个数(数组长度)

2.每次都对相邻的两个数据进行大小比较,如果需要,就交换他们的位置!

3.每趟要比较的次数都比前一趟少1次,第一趟要比较的次数为:$n-1

代码编写

总结了规律,接下来就是写排序算法了,下面为冒泡排序的代码:

//数组数据
$arr1 = array(18, 22, 12, 15, 23, 9);
echo '交换前: ';
print_r($arr1);
echo '<br>';
//数组长度
$n = count($arr1);
//控制需要进行的总趟数(数组从0开始所以要减1)
for ($i = 0; $i < $n - 1; $i++) {
    //在每一趟里面,控制进行的比较次数,比较次数为总趟数减去外for循环的趟数
    for ($k = 0; $k < ($n - 1) - $i; $k++) {
        //如果前面一项比后面一项大,就要进行交换
        if ($arr1[$k] > $arr1[$k + 1]) {
            $temp = $arr1[$k];
            $arr1[$k] = $arr1[$k + 1];
            $arr1[$k + 1] = $temp;
        } else {
            //如果左边比右边小,就什么都不做,继续后面两个数的比较,直到后面没有数值为止!
        }
    }
}
echo '交换后: ';
print_r($arr1);

排序前后.png

数据交换原理

在很多排序算法中,大部分的算法排序都是交换两个值达到排序的目的,下面通过一个简单的故事叙述一下阁主自己所理解的数据交换原理:

在一个月黑风高的夜晚,遇到人生的低谷,我左手拿着醋,右手拿着酱油,究于生活的无奈,我就是要把醋倒进酱油的瓶子,同时也要把酱油倒进装醋的瓶子里。无奈之下我必须得去隔壁废品站借个空瓶子,我得先把醋倒进空瓶子,再把酱油倒进已经空了的醋瓶子,接下来要把装满醋的空瓶子倒进已经空了的酱油瓶子里。这下醋和酱油本质不变,只是将瓶子换一下而已,至于空瓶子,我悄无声息的还给了废品站老板,感谢他的大恩大德!

普通变量的交换:

//普通变量的交换
$cu = "醋";
$jiangyou = "酱油";
//交换$cu,$jiangyou两个变量的值
$kongpingzi = $cu;
$cu = $jiangyou;
$jiangyou = $kongpingzi;
echo '$cu现在是: ' . $cu;
echo '<br>';
echo '$jiangyou现在是: ' . $jiangyou;

醋和酱油交换.png

数组单元的交换:

//数组单元的交换:如下,交换下面数组中的下标为2和下标为6的两个单元值
$arr2 = [2 => 15, 3 => 18, 6 => 20];
echo '交换前: ';
print_r($arr2);
$temp = $arr2[2];
$arr2[2] = $arr2[6];
$arr2[6] = $temp;
echo '<br>';
echo '交换后: ';
print_r($arr2);

交换前后2.png

本文地址:https://www.mainblog.cn/236.html
版权声明:本文为原创文章,版权归 阁主 所有,欢迎分享本文,转载请保留出处!
免责申明:有些内容源于网络,没能联系到作者。如侵犯到你的权益请告知,我们会尽快删除相关内容。

评论已关闭!