PHP常用排序算法01——冒泡、插入

对于排序算法,相信学计算机的同学都不会陌生。今天我们就来复习下常见的两个排序,适合小规模数据的排序算法:冒泡(bubbleSort)和插入(insertionSort)。
PS:对排序等算法还不太了解的同学,可以去看下这个链接哦,十大经典排序算法(动图演示),一些基础定义和动图演示做的很好啦,代码是用JavaScript实现的。我这个呢是PHP版本,而且有些小细节优化会注明在代码段上,都是经过本人实际操作的,下面开始正文。

1、冒泡排序
(1)概念:
①依次比较相邻的两个数据,大小关系不对,就互换位置;
②每一轮比较冒出一个数。
(2)优化:当某次冒泡操作已经没有数据交换时,说明已经达到完全有序,不用再继续执行后续的冒泡操作。
(3)代码实现如下:

public static function bubbleSort(){
        $array = [4,5,6,3,2,1];
        $count = count($array);
        //外层循环控制冒泡出去的个数,冒一个需要一个个去比较一轮
        for($i=0;$i<$count;$i++){    
            $flag = false; //提前退出冒泡循环的标志位。当不需要再比较的时候,就会停止循环了。该处是优化代码   
            for($j=0;$j<$count-$i-1;$j++){ //内层循环控制每一轮需要比较的次数。比如,冒出一个了,每轮就少比较一个数。冒出两个了,每轮就少比较两个数
                if($array[$j] > $array[$j+1]){
                    $temp        = $array[$j];
                    $array[$j]   = $array[$j+1];
                    $array[$j+1] = $temp;
                    
                    $flag        = true; //内层循环但凡比较了一次,$flag = true 就会执行,下一轮外层就会继续循环。该处是优化代码
                }
            }
            if(!$flag){break;}//内层循环但凡比较了一次,$flag = true 就会执行,下一轮外层就会继续循环。该处是优化代码
        }
        return $array;
    }

2、插入排序
(1)概念:
①将数组中的数据分为两个区间,已排序区间和未排序区间。
②初始已排序区间只有一个元素,就是数组的第一个元素。
③取未排序区间中的元素,在已排序区间中找到合适的插入位置将其插入,并保证已排序区间数据一直有序。重复这个过程,直到未排序区间中元素为空,算法结束。
(2)代码实现如下:

public static function insertionSort()
    {
        $array = [4,5,6,1,3,2];
        $count = count($array);     //分为已排序和未排序的。未排序的往已排序好的找准位置插入
        for($i=1;$i < $count;$i++){ //从第二个元素开始(未排序)往已排序的那块插入
            $value = $array[$i];    //未排序的,要排序的值
            $j     = $i - 1;        //未排序的前一个,即已排序的第一个下标
            //查找插入的位置
            for($j;$j >= 0;$j--){   //从已排序的第一个下标开始,一个个遍历对比未排序的
                if($array[$j] > $value){
                    $array[$j+1] = $array[$j]; //大小关系没按顺序排时,对比依次往后挪一个下标空间。腾出空间让新元素插入
                }else{  //因为左边是已经排好序的了,所以位置对了就可以跳出循环了
                    break;
                }
            }
            $array[$j+1] = $value;   //插入数据
        }
        return $array;
    }

3、冒泡和插入的比较
(1)冒泡排序和插入排序的时间复杂度都是 O(n2),都是原地排序算法(排序时不需要额外的存储空间),都是稳定的排序算法,空间复杂度均为O(1),比较适用于小规模的数据排序(至于大规模的数据排序,那就要用到快速排序、归并排序、堆排序之类的啦);
(2)但插入排序更受欢迎,因为从代码实现上来看,冒泡排序的数据交换要比插入排序的数据移动要复杂。如下图所示,很明显冒泡交换移动操作更多,更耗时。

图一: 冒泡数据交换

图二: 插入数据交换

posted @ 2021-01-16 11:17  snail_lie  阅读(139)  评论(0编辑  收藏  举报