算法详解【冒泡排序】

来源:互联网 发布:linux下新建文件命令 编辑:程序博客网 时间:2024/06/03 16:38

一、 最简单排序实现

为什么要学习冒泡排序?

冒泡排序是经典的排序方法,思想简单,操作容易,算法稳定性好。是排序的基础算法,学习它有很大的必要性。

思想:相邻记录比较,如果逆序则交换,这样一趟排序会使最大(最小)的记录落到最后,这称之为一趟排序。N个记录需要N-1趟排序。

二、 冒泡排序算法

$arr[$k+1])        {            $tmp=$arr[$k+1];            $arr[$k+1]=$arr[$k];            $arr[$k]=$tmp;        }    }} return $arr;} $arr=array(9,8,7,6,5,4,3);$arr = pao_sort($arr);var_dump($arr);//一次排序// 8,9,7,6,5,4,3// 8,7,9,6,5,4,3// 8,7,6,9,5,4,3// 8,7,6,5,9,4,3// 8,7,6,5,4,9,3// 8,7,6,5,4,3,9// 过程:// 8,7,6,5,4,3,9// 7,6,5,4,3,8,9// 6,5,4,3,7,8,9// 5,4,3,6,7,8,9// 4,3,5,6,7,8,9// 3,4,5,6,7,8,9//循环次数//6+5+4+3+2+1(内循环)//6(外循环)?>

三、 冒泡排序优化

我们发现当某一趟排序中没有记录发生交换,则说明记录已经有序,无需再进行后面的趟数的排序了。因此可以设置标志来标识一趟排序中是否有记录交换。

$arr[$k+1])              {                  $tmp=$arr[$k+1];                  $arr[$k+1]=$arr[$k];                  $arr[$k]=$tmp;                  $flag = 1;              }          }          if($flag == 0){ //在一趟排序中没有记录交换,则停止排序          break;          }      }      return $arr;} $arr=array(3,4,5,6,7,8,9);  $arr = pao_sort($arr); //调取冒泡排序方法var_dump($arr);?>

四、 冒泡排序复杂度分析

最好的情况当记录完全有序时,只需要n次比较,发现在这一趟中没有数据交换,则排序停止,记录已经有序,时间复杂度是 O(n) 。最坏的情况当记录完全逆序的时候,n个记录要排序n-1趟,每一堂都要交换接近n次,这样最终的时间负责度O(n2) 。

对于时间复杂度我们认为最坏的情况是本算法的时间复杂度,所以冒泡排序的时间复杂度是O(n2)。

稳定性: 在排序过程中,加入有两个相同数字,在排序前后的次序未改变,因此冒泡排序是稳定排序。

因为在最坏情况下(即倒序),所有元素的比较次数总和为(0+1…+n-1)→O(n2)。其他情况下也要考虑移动元素的次数。 故时间复杂度为O(n2)



原创粉丝点击