1、冒泡排序

  • 简介

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

  • 思路分析

在要排序的一组数中,对当前还未排好的序列,从前往后对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即,每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

  • 排充步骤:

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
    2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
    3. 针对所有的元素重复以上的步骤,除了最后一个。
    4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
  • 实现代码

<?php

//PHP冒泡排序算法Demo
$arr = [4,5,6,2,8,9,5,6,7,7,8,89,9,9,7,8,9,0,8,44,88,99,39];
function bubbleSort($arr){

    $len = count($arr); 
    //该层循环控制 需要冒泡的轮数
    for ($i = 0; $i < $len - 1 ; $i++){
    //该层循环用来控制每轮 冒出一个数 需要比较的次数
        for ($j = 0; $j < $len -1 - $i; $j++){
        //如果当前值大于自己后面值,进行位置互换
        if ($arr[$j] > $arr[$j+1]){
            $toRightNum = $arr[$j];
            $arr[$j] = $arr[$j+1];
            $arr[$j+1] = $toRightNum;
            }
        }
    }
    return $arr;
}

?>
  • 排序过程演示

php冒泡排序  

2、选择排序

  • 简介

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

  • 思路分析

在要排序的一组数中,选出最小的一个数与第一个位置的数交换。然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

  • 排序步骤

    1. 维护数组中最小的前 n 个元素的已排序序列。
    2. 每次从剩余未排序的元素中选取最小的元素,将其放在已排序序列的后面,作为序列的第 n+1 个记元素。
    3. 以空序列作为排序工作的开始,直到未排序的序列里只剩一个元素时(它必然为最大),只需直接将其放在已排序的记录之后,整个排序就完成了。
  • 实现代码

<?php
$arr = [4,5,6,2,8,9,5,6,7,7,8,89,9,9,7,8,9,0,8,44,88,99,39];
//选择排序:倒序
function selectSortDesc($arr){
    $length = count($arr);
    //双重循环完成,外层控制轮数,内层控制比较次数
    for ($i=0;$i<$length;$i++){
        //默认把第一个当做大的值
        $bigest = $i;
        //第一轮,第一个元素和第二个以后的元素逐个比较,找出最大的值对应的key
        //第二轮,第二个元素和第三个以后的元素逐个比较,找出最大的值对应的key
        //以此类推
        for ($j=$i+1;$j<$length;$j++){
            if ($arr[$bigest] < $arr[$j]){
                //如果当前值小于下一个值,则把下一个值的key赋值给$bigest
                $bigest = $j;
            }
        }
        if ($bigest != $i){
            //如果最终找到的最大的值的key不等于当前轮的key,则进行替换
            $temp = $arr[$bigest];
            $arr[$bigest] = $arr[$i];
            $arr[$i] = $temp;
        }
    }
    return $arr;
}

?>
  • 选择排序过程演示

php选择排序

 

3、插入排序

  • 简介

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

  • 思路分析

在要排序的一组数中,假设前面的数已经是排好顺序的,现在要把第n个数插到前面的有序数中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。

  • 排序步骤

    1. 从第一个元素开始,该元素可以认为已经被排序
    2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
    3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
    4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
    5. 将新元素插入到该位置中
    6. 重复步骤2
  • 实现代码

<?php
   $arr = [4,5,6,2,8,9,5,6,7,7,8,89,9,9,7,8,9,0,8,44,88,99,39];
  /**
 * 插入排序:正序
 * @param $arr
 * @return mixed
 */
function insertSortAsc($arr){
    $length = count($arr);
    //第0个元素默认当做已排好序的
    for ($i=1;$i<$length;$i++){ //每次取出第一个未排序的值 $firstNotSortValue = $arr[$i]; //从已排好序的最后一个元素开始往前找 for ($j=$i-1;$j>=0;$j--) {
            if ($firstNotSortValue < $arr[$j]) {
                $arr[$j+1] = $arr[$j];
                $arr[$j]   = $firstNotSortValue;
            } else {
                //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了,跳出本层循环提高排序效率
                //跳出循环的效率比不跳出循环的效率高出大约40%
                break;
            }
        }
    }
    return $arr;
}

?>
  • 插入 排序过程演示

PHP插入排序  

4、快速排序

  • 简介

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

  • 思路分析

选择一个基准元素,通常选择第一个元素或者最后一个元素。通过一趟扫描,将待排序列分成两部分,一部分比基准元素小,一部分大于等于基准元素。此时基准元素在其排好序后的正确位置,然后再用同样的方法递归地排序划分的两部分。

  • 排序步骤

    1. 从数列中挑出一个元素,称为 “基准”(pivot),
    2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
    3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
  • 实现代码

<?php
  //快速排序算法demo
$arr = [4,5,6,2,8,9,5,6,7,7,8,89,9,9,7,8,9,0,8,44,88,99,39];
function quickSort($arr){
    $length = count($arr);
    if ($length <= 1) return $arr;
    //取出一个值作为中间值
    $mid = $arr[0];
    //左右护法
    $left = [];
    $right = [];
    for ($i=1;$i<$length;$i++){
        if ($arr[$i] < $mid) {
            $left[] = $arr[$i];
        } else {
            $right[] = $arr[$i];
        }
    }
    $left = quickSort($left);
    $right = quickSort($right);
    return array_merge($left,array($mid),$right);
}
?>
  • 快速 排序过程演示

快速排序  

声明:

本站所有分享的资源,如无特殊说明或标注,均为网络收集整理。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。点击联系我们处理版权问题

  • 本站名称:追梦人博客
  • 本站永久地址:https://www.dreamren.cn
  • 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系在线客服进行删除处理
  • 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责
  • 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
  • 本站资源大多存储在云盘,如发现链接失效,请联系我们我们会第一时间更新
  • 如果您喜欢本站,♥点这儿开通会员资助本站
  • 如遇软件内有加群提示,为修改者自留,非本站信息,注意鉴别
  • 这些信息可能会帮助你了解本站:

SVIP会员 关于我们 网址导航 标签云