• php实现几个排序算法


     1 /** 
     2  * 冒泡排序的原理:
     3  *
     4  * 在一组无序的数组中,从前往后对每相邻的两个元素进行比较,
     5  * 大的向下沉(即往后排),小的向上浮(即往前排)
     6  */
     7 function bubbleSort($arr)
     8 {
     9     if (count($arr) <= 0) {
    10         return;
    11     }
    12     // 数组的长度,取出来作为一个固定值
    13     $len = count($arr);
    14     // 外层循环控制需要冒泡的轮数
    15     for ($i = 1; $i < $len; $i++) {
    16         // 内层循环控制每轮要比较的次数
    17         for ($j = 0; $j < $len - 1 - $i; $j++) {
    18             // 进行比较,大的数往下沉,小的往上浮
    19             if ($arr[$j] > $arr[$j+1]) {
    20                 $temp = $arr[$j];
    21                 $arr[$j] = $arr[$j+1];
    22                 $arr[$j+1] = $temp;
    23             }
    24         }
    25     }
    26 
    27     // 从小到大排好序的数组
    28     return $arr;
    29 }
     1 /**
     2  * 选择排序的原理:
     3  *
     4  * 在要排序的数组中,先找到数组中    最小的元素,放到数组的第一个位置,
     5  * 然后在剩下的元素中再找到最小的一个放到数组的第二个位置,直到循
     6  * 环到最后两个相比较出大小为止
     7  */
     8 function selectSort($arr)
     9 {
    10     if (count($arr) <= 0) {
    11         return;
    12     }
    13     // 取出数组长度作为一个固定值
    14     $len = count($arr);
    15     // 外层控制比较的轮数
    16     for ($i = 0;$i < $len; $i++) {
    17         // 先假设每轮的第一个数就是最小的    ,记录下下标
    18         $k = $i;
    19 
    20         // 内层控制每轮比较的次数
    21         // 从当前元素的下一个元素开始取出,和当前元素进行比较
    22         for ($j = $i+1; $j < $len; $j++) {
    23             // 当前元素为$arr[$k],默认是最小的
    24             if ($arr[$k] > $arr[$j]) {
    25                 $k = $j;
    26             }
    27         }
    28 
    29         // 一趟循环结束,将最小值的下标和先前默认取得的最小值的下标进行比较,并交换最小值放到数组第一个位置
    30         if ($k != $i) {
    31             $temp = $arr[$k];
    32             $arr[$k] = $arr[$i];
    33             $arr[$i] = $temp;
    34         }
    35     }
    36 
    37     return $arr;
    38 }
     1 /**
     2  * 插入排序的原理:
     3  *
     4  * 在要排序的数组中,假设前面已经排好了,现在要把第n个插入到前面的有序数中,
     5  * 使得这n个数也是排好序的,如此反复,直到全部排好。
     6  */
     7 function insertSort($arr)
     8 {
     9     if (count($arr) <= 0) {
    10         return;
    11     }
    12 
    13     $len = count($arr);
    14 
    15     // 外层循环控制比较的轮数
    16     for ($i = 1; $i < $len; $i++) {
    17         // 每一轮需要比较插入的元素
    18         $temp = $arr[$i];
    19 
    20         // 遍历目标元素前面的每一个元素,依次进行比较
    21         for ($j = $i - 1; $j >= 0; $j--) {
    22             if ($temp < $arr[$j]) {
    23                 // 遇到比目标元素的大的,那么将目标元素插入到前面比它大的元素之前
    24                 // 大的元素向后移动一个位置
    25                 $arr[$j+1] = $arr[$j];
    26 
    27                 $arr[$j] = $temp;
    28 
    29             } else {
    30                 // 如果碰到不要移动的元素,则不再比较
    31                 break;
    32             }
    33         }
    34     }
    35 
    36     return $arr;
    37 }
     1 /**
     2  * 快速排序的原理:
     3  *
     4  * 选择一个基准元素,通常选择第一个或者最后一个,然后将数组中的每一个元素和基准元素进行比较,
     5  * 然后将所有元素分成两批待排序的元素,一批比基准元素大的,一批比基准元素小的,然后对两批元素
     6  * 再使用同样的方法进行排序    
     7  */
     8 function quickSort($arr)
     9 {
    10     if (count($arr) <= 0) {
    11         return;
    12     }
    13 
    14     // 数组长度
    15     $len = count($arr);
    16 
    17     // 选择第一个元素作为基准元素
    18     $base = $arr[0];
    19     // 小于基元素的一批
    20     $left_arr = [];
    21     // 大于基元素的一批
    22     $right_arr = [];
    23 
    24     for ($i = 1; $i < $len; $i++) {
    25         if ($arr[$i] < $base) {
    26             $left_arr[] = $arr[$i];
    27         } else {
    28             $right_arr[] = $arr[$i];
    29         }
    30     }
    31 
    32     // 对两个数组再进行递归排序
    33     quickSort($left_arr);
    34     quickSort($right_arr);
    35 
    36     // 合并数组并返回
    37     return array_merge($left_arr, array($base), $right_arr);
    38 }
  • 相关阅读:
    将新的rpm包添加到本地yum源
    linux cp命令直接覆盖不提示按Y/N的方法
    十一月二十一学习报告
    十一月二十学习报告
    十一月十九学习报告
    十一月十八学习报告
    十一月十七学习报告
    十一月十五学习报告
    十一月十四学习报告
    十一月十三学习报告
  • 原文地址:https://www.cnblogs.com/0519xf/p/7515072.html
Copyright © 2020-2023  润新知