王朝百科
分享
 
 
 

冒泡排序

王朝百科·作者佚名  2010-02-13  
宽屏版  字体: |||超大  

冒泡排序

基本概念冒泡排序(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

1 #include <stdio.h>

2

3 void bubblesort(int v[], int n);

4

5 void bubblesort(int v[], int n){

6 int i, j, t;

7 for(i = 0;i < n;i++){

8 j = n - i - 1;

9 while(j--){

10 if(v[j] < v[j-1]){

11 t = v[j-1];

12 v[j-1] = v[j];

13 v[j] = t;

14 }

15 }

16 }

17 }

18

19 int main(){

20 int arr[] = {1,3,5,2,4,7,6,8,9}, len = 9;

21

22 bubblesort(arr, len);

23

24 while(len--){

25 printf("%d - %d

", len, arr[len]);

26 }

27

28 return 0;

29 }

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 ; 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>

冒泡排序法的改进比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。

为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。

性能分析若记录序列的初始状态为"正序",则冒泡排序过程只需进行一趟排序,在排序过程中只需进行n-1次比较,且不移动记录;反之,若记录序列的初始状态为"逆序",则需进行n(n-1)/2次比较和记录移动。因此冒泡排序总的时间复杂度为O(n*n)。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如何用java替换看不见的字符比如零宽空格&#8203;十六进制U+200B
 干货   2023-09-10
网页字号不能单数吗,网页字体大小为什么一般都是偶数
 干货   2023-09-06
java.lang.ArrayIndexOutOfBoundsException: 4096
 干货   2023-09-06
Noto Sans CJK SC字体下载地址
 干货   2023-08-30
window.navigator和navigator的区别是什么?
 干货   2023-08-23
js获取referer、useragent、浏览器语言
 干货   2023-08-23
oscache遇到404时会不会缓存?
 干货   2023-08-23
linux下用rm -rf *删除大量文件太慢怎么解决?
 干货   2023-08-08
刀郎新歌破世界纪录!
 娱乐   2023-08-01
js实现放大缩小页面
 干货   2023-07-31
生成式人工智能服务管理暂行办法
 百态   2023-07-31
英语学习:过去完成时The Past Perfect Tense举例说明
 干货   2023-07-31
Mysql常用sql命令语句整理
 干货   2023-07-30
科学家复活了46000年前的虫子
 探索   2023-07-29
英语学习:过去进行时The Past Continuous Tense举例说明
 干货   2023-07-28
meta name="applicable-device"告知页面适合哪种终端设备:PC端、移动端还是自适应
 干货   2023-07-28
只用css如何实现打字机特效?
 百态   2023-07-15
css怎么实现上下滚动
 干货   2023-06-28
canvas怎么画一个三角形?
 干货   2023-06-28
canvas怎么画一个椭圆形?
 干货   2023-06-28
canvas怎么画一个圆形?
 干货   2023-06-28
canvas怎么画一个正方形?
 干货   2023-06-28
中国河南省郑州市金水区蜘蛛爬虫ip大全
 干货   2023-06-22
javascript简易动态时间代码
 干货   2023-06-20
感谢员工的付出和激励的话怎么说?
 干货   2023-06-18
 
>>返回首页<<
 
 
 
静静地坐在废墟上,四周的荒凉一望无际,忽然觉得,凄凉也很美
© 2005- 王朝网络 版权所有