php 3推荐4算法,PHP 中四大经典排序算法

1、冒泡排序

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

1 // 升序

2 $arr=[1,43,54,62,21,66,32,78,36,76,39];

3 function bubblesort($arr)

4 {

5 $len=count($arr);

6 //该层循环控制 需要冒泡的轮数

7 for($i=1;$i

8 { //该层循环用来控制每轮 冒出一个数 需要比较的次数

9 for($k=0;$k

10 {

11 if($arr[$k]>$arr[$k+1])

12 {

13 $tmp=$arr[$k+1];

14 $arr[$k+1]=$arr[$k];

15 $arr[$k]=$tmp;

16 }

17 }

18 }

19 return $arr;

20 }

21 // 降序

22 function bubblesort($arr)

23 {

24 $len=count($arr);

25 for($i=1;$i

26 {

27 for($k=0;$k

28 {

29 // 只需要此处大小比较进行替换即可

30 if($arr[$k]

31 {

32 $tmp=$arr[$k+1];

33 $arr[$k+1]=$arr[$k];

34 $arr[$k]=$tmp;

35 }

36 }

37 }

38 return $arr;

39 }

2、快速排序

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

1 function quicksort($arr) {

2 //先判断是否需要继续进行

3 $length = count($arr);

4 if($length <= 1) {

5 return $arr;

6 }

7 //选择第一个元素作为基准

8 $base_num = $arr[0];

9 //遍历除了标尺外的所有元素,按照大小关系放入两个数组内

10 //初始化两个数组

11 $left_array = array(); //小于基准的

12 $right_array = array(); //大于基准的

13 for($i=1; $i

14 if($base_num > $arr[$i]) {

15 //放入左边数组

16 $left_array[] = $arr[$i];

17 } else {

18 //放入右边

19 $right_array[] = $arr[$i];

20 }

21 }

22 //再分别对左边和右边的数组进行相同的排序处理方式递归调用这个函数

23 $left_array = quicksort($left_array);

24 $right_array = quicksort($right_array);

25 //合并

26 return array_merge($left_array, array($base_num), $right_array);

27 }

3、插入排序

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

1 // 方式一(从大到小排)

2 function quiclysort($arr) {

3 $count = count($arr);

4 for ($i=1;$i

5 $tmp = $arr[$i];

6 $j = $i - 1;

7 while ($j >= 0 && $tmp > $arr[$j]) {

8 $arr[$j+1] = $arr[$j--];

9 }

10 $arr[$j+1] = $tmp;

11 }

12 return $arr;

13 }

14 // 方式二(从小到大排)

15 function insertsort($arr) {

16 $len=count($arr);

17 for($i=1, $i

18 $tmp = $arr[$i];

19 //内层循环控制,比较并插入

20 for($j=$i-1;$j>=0;$j--) {

21 if($tmp < $arr[$j]) {

22 //发现插入的元素要大,交换位置,将后边的元素与前面的元素互换

23 $arr[$j+1] = $arr[$j];

24 $arr[$j] = $tmp;

25 } else {

26 //如果碰到不需要移动的元素,由于是已经排序好是数组,则前面的就不需要再次比较了。

27 break;

28 }

29 }

30 }

31 return $arr;

32 }

4. 选择排序

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

1 function selectsort($arr) {

2 //双重循环完成,外层控制轮数,内层控制比较次数

3 $len=count($arr);

4 for($i=0; $i

5 //先假设最小的值的位置

6 $p = $i;

7 for($j=$i+1; $j

8 //$arr[$p] 是当前已知的最小值

9 if($arr[$p] > $arr[$j]) {

10 //比较,发现更小的,记录下最小值的位置;并且在下次比较时采用已知的最小值进行比较。

11 $p = $j;

12 }

13 }

14 //已经确定了当前的最小值的位置,保存到$p中。如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。

15 if($p != $i) {

16 $tmp = $arr[$p];

17 $arr[$p] = $arr[$i];

18 $arr[$i] = $tmp;

19 }

20 }

21 //返回最终结果

22 return $arr;

23 }

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
├──Package │ ├── Sort 排序篇 │ │ ├── BubbleSort.php 冒泡排序 │ │ ├── HeapSort.php 堆排序 大根堆 │ │ ├── MBaseSort.php 基数排序 MSD │ │ ├── LBaseSort.php 基数排序 LSD │ │ ├── QuickSort.php 快速排序 │ │ ├── ShuttleSort.php 飞梭排序 │ │ ├── ShellSort.php 希尔排序 │ │ ├── MergeSort.php 归并排序 │ │ ├── InsertSort.php 插入排序 │ │ └── SelectSort.php 选择排序 │ │ │ ├── Query 查找篇 │ │ ├── BinaryQuery.php 二分查找 │ │ ├── InseertQuery.php 插入查找 │ │ ├── FibonacciQuery.php 斐波那契查找 │ │ ├── BFSQuery.php 广度优先查找 │ ├── Kmp.php 算法导论-KMP算法 │ ├── DijkstraQuery.php 迪克斯特拉算法 │ │ └── QulickQuery.php 快速查找 │ │ │ ├── Structure 数据结构 │ │ ├── StackExample.php 堆栈 先进后出 LIFO (Last In First Out) │ │ ├── LinearChain.php 线性表 单链存储 │ │ └── LinearOrder.php 线性表 顺序存储 │ │ └── BinarySearchTree.php 二叉搜索树 │ │ │ ├── Tools 小工具集 │ │ └── SystemSwitch.php 堆栈实现进制转换 │ │ │ └── Other 其他 │ ├── MonkeyKing.php 约瑟夫环 │ ├── DynamicProgramming.php 动态规划 │ ├── Fibonacci.php 斐波那契数列 │ ├── StealingApples.php 偷苹果求余 │ ├── HanoiGames.php 汉诺塔游戏 │ ├── BidirectionalQueue.php 双向队列 │ ├── ColorBricks.php 彩色砖块 │ ├── GetCattle.php 牛年求牛 │ ├── OnlyNumbers.php 求唯一数 │ ├── PokerGames.php 洗扑克牌 │ ├── Interval.php 抽奖区间算法 │ ├── Maze.php 迷宫寻址算法 │ ├── AntsClimb.php 蚂蚁爬杆算法 │ ├── Encryption.php 对称加密算法 │ ├── ElevatorDispatch.php 编程之美-电梯调度算法 │ ├── PointInTriangle.php 向量叉集计算点是否在三角形 │ ├── TraversalOfBinary.php 二叉树非递归遍历算法实现 │ ├── Knapsack.php 贪心算法之背包问题实现 │ └── BigSmallReplace.php Hello World 输出 Olleh Dlrow │ └── Solution.php Facebook面试题之岛屿周长算法 │ └── RotationSort.php Facebook面试题之顺时针回旋算法 │ └── Square.php Facebook面试题之判断四个点能否组成正方形算法 │ └── Prim.php Prim算法(最小生成树算法) │ └── CartesianProduct.php 笛卡尔积算法 │ └── Square.php 面试题之平面任意四点能否组成一个矩形 │ └── Judge.php 面试题之扑克牌任选五张判断是不是顺子 │ └── Factorial.php 面试题之N的阶乘末尾有多少个0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值