冒泡排序(Bubble Sort),是一种较简单的、稳定的排序算法。冒泡排序算法步骤:比较相邻的元素,如果第一个比第二个大,就交换他们两个的位置;对每对相邻的元素执行同样的操作,这样一趟下来,最后的元素就是最大的;除了已得出来的最大元素,把剩余的元素重复前面步骤,直到没有元素再需要比较为止,这样排序就完成了。冒泡算法,在最好情况下,时间复杂度为O(n);在最坏情况下,时间复杂度为O(n2);平均时间复杂度为O(n2)。

PHP实现冒泡排序、双向冒泡排序算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
<?php
/**
  * 数据结构与算法(PHP实现) - 冒泡排序(Bubble Sort)。
  *
  * @author 创想编程(TOPPHP.ORG)
  * @copyright Copyright (c) 2013 创想编程(TOPPHP.ORG) All Rights Reserved
  * @license http://www.opensource.org/licenses/mit-license.php MIT LICENSE
  * @version 1.0.0 - Build20130608
  */
class BubbleSort {
   /**
    * 冒泡排序。
    *
    * @var integer
    */
   const SORT_NORMAL = 1;
 
   /**
    * 双向冒泡排序。
    *
    * @var integer
    */
   const SORT_DUPLEX = 2;
 
   /**
    * 需要排序的数据数组。
    *
    * @var array
    */
   private $data ;
 
   /**
    * 数据数组的长度。
    *
    * @var integer
    */
   private $size ;
 
   /**
    * 数据数组是否已排序。
    *
    * @var boolean
    */
   private $done ;
 
   /**
    * 构造方法 - 初始化数据。
    *
    * @param array $data 需要排序的数据数组。
    */
   public function __construct( array $data ) {
     $this ->data = $data ;
     $this ->size = count ( $this ->data);
     $this ->done = FALSE;
   }
 
   /**
    * 交换数据数组中两个元素的位置。
    *
    * @param integer $x 元素在数组中的索引。
    * @param integer $y 元素在数组中的索引。
    */
   private function swap( $x , $y ) {
     $temp = $this ->data[ $x ];
     $this ->data[ $x ] = $this ->data[ $y ];
     $this ->data[ $y ] = $temp ;  
   }
 
   /**
    * 冒泡排序。
    */
   private function sort() {
     $this ->done = TRUE;
 
     for ( $i = 1; $i < $this ->size; ++ $i ) {
       // 记录交换数据的次数。
       $swap = 0;
 
       for ( $j = $this ->size - 1; $j > $i - 1; -- $j ) {
         if ( $this ->data[ $j ] < $this ->data[ $j - 1]) {
           $this ->swap( $j - 1, $j );
           ++ $swap ;
         }
       }
 
       // 若交换数据的次数为0,说明数据数组已有序,不必再进行排序。
       if (0 === $swap ) {
         break ;
       }
     }
   }
 
   /**
    * 双向冒泡排序。
    */
   private function duplexSort() {
     $this ->done = TRUE;
 
     for ( $i = 1; $i <= floor ( $this ->size / 2); ++ $i ) {
       // 记录交换数据的次数。
       $swap = 0;
 
       for ( $j = $this ->size - 1, $k = $i - 1;
         $j > $i - 1 && $k < $this ->size - 1; -- $j , ++ $k ) {
         if ( $this ->data[ $j ] < $this ->data[ $j - 1]) {
           $this ->swap( $j - 1, $j );
           ++ $swap ;
         }
 
         if ( $this ->data[ $k ] > $this ->data[ $k + 1]) {
           $this ->swap( $k , $k + 1);
           ++ $swap ;
         }
       }
 
       // 若交换数据的次数为0,说明数据数组已有序,不必再进行排序。
       if (0 === $swap ) {
         break ;
       }
     }
   }
 
   /**
    * 获取排序后的数据数组。
    *
    * @param integer $sort 排序算法:SORT_NORMAL为冒泡排序;SORT_DUPLEX为双向冒泡排序。
    * @return array 返回排序后的数据数组。
    */
   public function getResult( $sort = self::SORT_NORMAL) {
     // 若已排序则无需再进行排序,直接返回排序好的数据数组。
     if ( $this ->done) {
       return $this ->data;
     }
 
     switch ( $sort ) {
       case self::SORT_DUPLEX:
         $this ->duplexSort();
         break ;
 
       case self::SORT_NORMAL:
       default :
         $this ->sort();
         break ;
     }
 
     return $this ->data;
   }
}
?>
示例代码
1
2
3
4
<?php
$bubble = new BubbleSort( array (35, 75, 92, 41, 27, 58));
echo '<pre>' , print_r( $bubble ->getResult(BubbleSort::SORT_DUPLEX), TRUE), '</pre>' ;
?>

PHP实现冒泡排序、双向冒泡排序算法的更多相关文章

  1. Problem D: 双向冒泡排序

    Problem D: 双向冒泡排序 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 447  Solved: 197[Submit][Status][We ...

  2. python 排序冒泡排序与双向冒泡排序

    冒泡排序: 冒泡排序就是每次找出最大(最小)元素,放在集合最前或最后,这是最简单的排序算法 def bubble_sort(collection): #升序排列 length=len(collecti ...

  3. PHP描述冒泡排序和快速排序算法

    使用PHP描述冒泡排序和快速排序算法,对象可以是一个数组.使用PHP描述顺序查找和二分查找(也叫做折半查找)算法,顺序查找必须考虑效率,对象可以是一个有序数组.写一个二维数组排序算法函数,能够具有通用 ...

  4. Java - 冒泡排序的基础算法(尚学堂第七章数组)

    /** * 冒泡排序的基础算法 */ import java.util.Arrays; public class TestBubbleSort1 { public static void main(S ...

  5. Qt 5.11的QChar、QString、QTextBoundaryFinder和双向文本算法现在完全兼容Unicode 10

    本文翻译自:Qt 5.11 released 原文作者: Qt公司CTO兼Qt开源项目维护官Lars Knoll翻译校审:Richard.Hongfei.Haipeng 5月22日,我们提发布了Qt ...

  6. C++实现双向RRT算法

    C++实现双向RRT算法 背景介绍 RRT(Rapidly-exploring Random Trees)是Steven M. LaValle和James J. Kuffner Jr.提出的一种通过所 ...

  7. [6] 算法路 - 双向冒泡排序的Shaker

    Shaker序列 –算法 1. 气泡排序的双向进行,先让气泡排序由左向右进行.再来让气泡排序由右往左进行,如此完毕一次排序的动作 2. 使用left与right两个旗标来记录左右两端已排序的元素位置. ...

  8. java基础 - 冒泡排序,随机数算法

    从简单做起 任何困难的事情都是由简单的一步步一件件事情堆起来 理解好算法才是最重要 1.冒泡排序: public class Test { public static void main(String ...

  9. 排序系列 之 冒泡排序及其改进算法 —— Java实现

    冒泡排序算法 冒泡排序算法 改进一 冒泡排序算法 改进二 冒泡排序算法 改进三 冒泡排序算法 基本思想: 在要排序的一组数中,对当前还未排好序的范围内的全部数据,自上而下对相邻的两个数依次进行比较和调 ...

随机推荐

  1. [置顶] 应广大童鞋的要求提供一个封装模块,直接和ADB 服务进程交互

    很多童鞋在用ADB 的时候都是直接启动ADB 的进程,然后通过管道的方式获取输出,这样多个线程同时使用ADB 的时候任务管理器一闪一闪的,是不是很不爽啊,原先介绍过可以直接和ADB 服务进程通信,不用 ...

  2. Cocos2dx 3.0 过渡篇(三十一)ValueVector和Vector不得不说的故事

    本文投票地址:http://vote.blog.csdn.net/Article/Details?articleid=37834689 前天看到一个颇为纠结的选择题:有一天你遇到一个外星人,这时外星人 ...

  3. Lazy Math Instructor

      Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 3721   Accepted: 1290 Description A m ...

  4. mysql高可用架构方案之二(keepalived+lvs+读写分离+负载均衡)

    mysql主从复制与lvs+keepalived实现负载高可用 文件夹 1.前言    4 2.原理    4 2.1.概要介绍    4 2.2.工作原理    4 2.3.实际作用    4 3方 ...

  5. App 运营 推广相关

    基本要素 1.定位和产品 2.取个好名字,一目了然+下载冲动 3.设计一个好图标,有感性和直观的认识 4.做好产品的说明.关键字,截图(前1-2行是重点) 5.做市场的排名(相关因素如下)   (1) ...

  6. Jexus + Kestrel 部署 asp.net core

    结合Jexus + Kestrel 部署 asp.net core 生产环境 ASP.NET Core 是微软的全新的框架.这一框架的目标 ︰ 跨平台 针对云应用优化 解除 System.Web 的依 ...

  7. TPL异步并行编程之任务超时

    此处参考自阿涛的博文:http://www.cnblogs.com/HelloMyWorld/p/5526914.html 一 自己定义 基本的思路: net中异步操作由于是交给线程来实现,因此不可能 ...

  8. WAS ND集群中的HTTP内存会话复制对Java应用程序序列化编程的要求

    应用程序需要遵守的约定 在会话中没有自定义对象时,WAS 集群的 HTTP 会话内存复制特性成功地实现了高可用性,使用户在宕机过程中的会话信息没有丢失,操作没有受到任何影响. 在会话中包含自定义对象时 ...

  9. UVA 116 Unidirectional TSP(dp + 数塔问题)

     Unidirectional TSP  Background Problems that require minimum paths through some domain appear in ma ...

  10. 深入理解 JBoss 7/WildFly Standalone 模式启动过程

    概述 JBoss 7/WildFly Standalone 模式启动过程大致例如以下: 启动脚本 standalone.sh 启动 JBoss Modules,JBoss Modules 启动 JBo ...