PHP排序算法系列:冒泡排序

来源:互联网 发布:mac和nars口红哪个便宜 编辑:程序博客网 时间:2024/05/21 07:13

冒泡排序

冒泡排序(英语:Bubble Sort,台湾另外一种译名为:泡沫排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

原理

假定有一组数据(乱序),现要将这些数据按从小到大进行排序。

1 从左到右依次比较相邻的两个数,将小的数放在左边,大的数放在右边,这样依次比较下来,最大的数在最右方。

2 因为最后一位一定是正确的,所以继续对除最后一位的数组重复上面的步骤,直到排序完成。

例子

假定有一数组$a=[1,5,6,3,8,4],现需要将它们按从小到大排序
经过步骤一,数组变为$a=[1,5,3,6,4,8],现在保证的数组的最后一位是正确的,接着将数组除了最后一位继续重复步骤一,直至排序完成。

PHP代码实现

function bubbleSort($myArray){    $length=count($myArray);    for ($i=0; $i <$length-1 ; $i++) {        for ($j=0; $j < $length-1-$i; $j++) {            if ($myArray[$j]>$myArray[$j+1]) {                $temp=$myArray[$j];                $myArray[$j]=$myArray[$j+1];                $myArray[$j+1]=$temp;            }        }    }    return $myArray;}

算法时间复杂度计算

所需关键字的比较次数C=n(n-1)/2=O(n2)
所以冒泡排序的时间复杂度为O(n2)

冒泡排序优化思想

对冒泡排序的优化主要是减少交换次数。如果一次扫描中元素没有发生交换,那么排序就可以结束了。为此可设置一标志量flag,默认为false,如果扫描中发生交换了则把flag置为true,下轮扫描前先检查这个变量,如果flag=false则排序结束。
更进一步,可以记录每次扫描中最后一次交换的位置,下次扫描的时候只要扫描到上次的最后交换位置就行了,因为后面的都是已经排好序的,无需再比较。

冒泡排序优化PHP代码实现

function bubbleSort($myArray){    $length=count($myArray);    for ($i=0; $i <$length-1 ; $i++) {        $flag=false;        for ($j=0; $j < $length-1-$i; $j++) {            if ($myArray[$j]>$myArray[$j+1]) {                $temp=$myArray[$j];                $myArray[$j]=$myArray[$j+1];                $myArray[$j+1]=$temp;                $flag=true;            }        }        if(!$flag){            return $myArray;        }    }    return $myArray;}
0 0
原创粉丝点击