冒泡算法

  冒泡 排序(BubbleSort)的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。而后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。重复以上过程,仍从第一对数开始比较(由于可能因为第2个数和第3个数的交换,使得第1个数再也不小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中获得一个新的最大数。如此下去,直至最终完成排序。
  因为在排序过程当中老是小数往前放,大数日后放,至关于气泡往上升,因此称做冒泡排序。
  用二重循环实现,外循环变量设为i,内循环变量设为j。外循环重复9次,内循环依次重复9,8,...,1次。每次进行比较的两个元素都是与内循环j有关的,它们能够分别用a[j]和a[j+1]标识,i的值依次为1,2,...,9,对于每个i, j的值依次为1,2,...10-i。
  冒泡排序是稳定的。

产生

  在许多程序设计中,咱们须要将一个数列进行排序,以方便统计,常见的排序方法有冒泡排序, 二叉树 排序, 选择排序 等等。而冒泡排序一直因为其简洁的思想方法和比较高的效率而倍受青睐。

排序过程

  设想被排序的数组R[1..N]垂直竖立,将每一个数据元素看做有重量的气泡,根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R,凡扫描到违反本原则的轻气泡,就使其向上"漂浮",如此反复进行,直至最后任何两个气泡都是轻者在上,重者在下为止。

算法示例

  49 13 13 13 13 13 13 13
  38 49 27 27 27 27 27 27
  65 38 49 38 38 38 38 38
  97 65 38 49 49 49 49 49
  76 97 65 49 49 49 49 49
  13 76 97 65 65 65 65 65
  27 27 76 97 76 76 76 76
  49 49 49 76 97 97 97 97
  Procedure BubbleSort(Var R : FileType) //从下往上扫描的 起泡排序 //
  Begin
  For I := 1 To N-1 Do //作N-1趟排序//
  begin
  NoSwap := True; //置未排序的标志//
  For J := N - 1 DownTo 1 Do //从底部往上扫描//
  begin
  If R[J+1]< R[J] Then //交换元素//
  begin
  Temp := R[J+1]; R[J+1 := R[J]; R[J] := Temp;
  NoSwap := False
  end;
  end;
  If NoSwap Then Return//本趟排序中未发生交换,则终止算法//
  end
  End; //BubbleSort//
  该算法的时间复杂性为O(n^2),算法为稳定的排序方

冒泡排序代码

C

  void bubble_sort(int a[], int n)
  {
  int i = n-1; bool change = true;
  for (; i>=1&&change; --i)
  {
  change = false;
  for (int j = 0; j<i; ++j)
  {
  if (a[j]>a[j+1])
  {
  int nTemp = a[j+1];
  a[j+1] = a[j];
  a[j] = nTemp;
  change = true;
  }
  }
  }
  }

C++

  #include <iostream>
  #define LEN 9
  using namespace std;
  int main(){
  int nArray[LEN];
  for(int i=0;i<LEN;i++)nArray[i]=LEN-i;
  cout<<"原始数据为:"<<endl;
  for(int i=0;i<LEN;i++)cout<<nArray[i]<<" ";
  cout<<endl;
  //开始冒泡
  {
  int temp;
  for(int i=LEN-1;i>0;i--)
  for(int j=0;j<=i;j++){
  if(nArray[j]>nArray[j+1]){
  temp=nArray[j];
  nArray[j]=nArray[j+1];
  nArray[j+1]=temp;
  }
  }
  }
  //结束冒泡
  cout<<"排序结果:"<<endl;
  for(int i=0;i<LEN;i++)cout<<nArray[i]<<" ";
  return 0;
  }

PHP

  <?php
  //冒泡排序(一维数组)
  function bubble_sort($array)
  {
  $count = count($array);
  if ($count <= 0) return false;
  for($i=0; $i<$count; $i++)
  {
  for($j=$count-1; $j>$i; $j--)
  {
  if ($array[$j] < $array[$j-1])
  {
  $tmp = $array[$j];
  $array[$j] = $array[$j-1];
  $array[$j-1] = $tmp;
  }
  }
  }
  return $array;
  }
  //使用实例
  $_array = array('5', '8' ,'5' ,'6' ,'9' ,'3' ,'2' ,'4');
  $_array = bubble_sort($_array);
  print ($_array);
  ?>

Ruby

  def bubble(arr)
  (arr.length-1).downto(1) do |j|
  a1 = arr.dup
  j.times do |i|
  if arr > arr[i+1]
  arr,arr[i+1] = arr[i+1],arr
  end
  end
  break if a1 == arr
  end
  arr
  end

Java

  static void BubbleSort(int a []){
  int temp=0;
  for (int i = 0; i < a.length-1 ; i++) {
  for (int j = 0; j < a.length - i - 1; j++){
  if (a[j]>a[j + 1]){ //把这里改为大于,就是升序了
  temp=a[j];
  a[j]=a[j + 1];
  a[j + 1]=temp;
  }
  }
  }
  }
  

Visual Basic

  
  Option Explicit
  Private Sub Form_click()
  Dim a, c As Variant
  Dim i As Integer, temp As Integer, w As Integer
  a = Array(12, 45, 17, 80, 50)
  For i = 0 To UBound(a) - 1
  If (a(i) > a(i + 1)) Then '如果递减,改成a(i)<a(i+1)
  temp = a(i)
  a(i) = a(i + 1)
  a(i + 1) = temp
  End If
  Next
  For Each c In a
  Print c;
  Next
  End Sub

Pascal

  <i id="bks_9tjbxut2">program bubblesort;
  const
  N=20;
  MAX=10;
  var
  a:array[1..N] of 1..MAX;
  temp,i,j:integer;
  begin
  randomize;
  for i:=1 to N do a:=1+random(MAX);
  writeln('Array before sorted:');
  for i:=1 to N do write(a,' ');
  writeln;
  for i:=N-1 downto 1 do
  for j:=1 to i do
  if a[j]<a[j+1] then
  begin
  temp:=a[j];
  a[j]:=a[j+1];
  a[j+1]:=temp
  end;
  writeln('Array sorted:');
  for i:=1 to N do write(a,' ');
  writeln;
  writeln('End sorted.');
  readln;
  end.

C#

  public void BubbleSort(int[] array) {
  int length = array.Length;
  for (int i = 0; i <= length - 2; i++) {
  for (int j = length - 1; j >= 1; j--) {
  if (array[j] < array[j - 1] ) {
  int temp = array[j];
  array[j] = array[j - 1];
  array[j - 1] = temp;
  }
  }
  }
  }

Python

  #BubbleSort used python3.1 or python 2.x
  def bubble(str):
  tmplist = list(str)
  count = len(tmplist)
  for i in range(0,count-1):
  for j in range(0,count-1):
  if tmplist[j] > tmplist[j+1]:
  tmplist[j],tmplist[j+1] = tmplist[j+1],tmplist[j]
  return tmplist
  #useage:
  str = "zbac"
  print(bubble(str)) # ['a', 'b', 'c', 'z']
  number=[16,134,15,1]
  print(bubble(number)) # [1, 15, 16, 134]

JS

  <script language="javascript">
  var DataOne=new Array(5,6,7,8,3,1,2,-1,100)
  var len=DataOne.length
  for(var i=0;i<len;i++)
  {
  for(var j=0;j<len;j++)
  {
  One=DataOne[j]
  Two=DataOne[j+1]
  if(One<Two)
  {
  DataOne[j]=Two
  DataOne[j+1]=One
  }
  }
  }
  var str=""
  for(var n=0;n<len;n++)
  {
  str+=DataOne[n]+","
  }
  alert(str)
  </script>

改进

  假设需用冒泡排序将四、五、七、一、二、3这6个数排序。在该列中,第三趟排序结束后,数组已排好序,但计算机此时并不知道,所以还须要进行一趟比较。若是这一趟比较中未发生任何数据交换,则计算机知道已排序好,能够再也不进行比较了。于是第四趟比较须要进行,但第五趟比较则是没必要要的。为此,咱们能够考虑程序的优化。
  为了标志是否须要继续比较,声明一个布尔量flag,在进行每趟比较前将flag置true。若是在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,若是它仍为true(代表在该趟比较中未发生一次数据交换)则结束排序,不然进行下一趟比较。

性能分析

  若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程当中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。所以冒泡排序总的时间复杂度为O(n*n)。
相关文章
相关标签/搜索