什么是冒泡排序算法

 我来答
纵横竖屏
2018-10-15 · TA获得超过46.7万个赞
知道小有建树答主
回答量:164
采纳率:93%
帮助的人:7.4万
展开全部

冒泡排序算法:重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。

这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

扩展资料:

冒泡排序算法的原理如下:

1,比较相邻的元素。如果第一个比第二个大,就交换他们两个。

2,对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。

3,针对所有的元素重复以上的步骤,除了最后一个。

4,持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

参考资料:百度百科---冒泡排序

车芊力文曜
2019-12-25 · TA获得超过3670个赞
知道大有可为答主
回答量:3085
采纳率:31%
帮助的人:408万
展开全部
基本思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有
n
个元素,那么一共要进行
n-1
轮比较,第
i
轮要进行
j=n-i
次比较。
我也不知道你说的是用哪种语言编写:就列出了如下几种,希望你能满意
#include<stdio.h>
void
main()
{
int
a[10];
int
i,j,t;
printf("输入10个整数:\n");
for(
i
=
0;
i
<
10;
i
++
)
scanf("%d",&a[
i
]);
//依次输入10个整数
for(
j
=
0;
j
<
9;
j
++
)
//进行9轮排序
即n-1次
{
for(
i
=
0;
i
<
9-j;
i
++)
//每轮进行n-1-j
次比较,最多n-1-j
次交换
if(
a[
i
]
>
a[
i
+
1
]
)
{
t
=
a[
i
]
;
a[
i
]
=
a[
i
+
1
];
//小的沉底,大的上浮
a[
i
+
1
]
=
t;
}
}
printf("排序结果:");
for(
i
=
0;
i
<
10;
i
++
)
//依次输出排序结果
printf("%d\t",a[
i
]);
printf("\n");
}
PASCAL为例子
procedure
Bubble_Sort(var
L:List);
vari,j:position;
begin
for
i:=First(L)
to
Last(L)-1
do
for
j:=First(L)
to
Last(L)-i
do
if
L[j]>L[j+1]
then
4
swap(L[j],L[j+1]);
//交换L[j]和L[j+1]
end;
下面使用c++语言编写
#include<iostream.h>
void
main()
{
int
a[n],i,j,temp;
cout<<"请输入数字:"<<endl;
for(i=0;i<=n;i++)
cin>>a;
//依次输入n个整数
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(a<a[j])
//利用临时变量temp交换顺序
{
temp=a[j];
a[j]=a;
a=temp;
}
cout<<a<<'
';
//依次输出结果
}
下面使用Visual
Basic编写
Option
Explicit
Private
Sub
Form_Load()
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
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
hibboyspring
2009-06-13 · TA获得超过259个赞
知道答主
回答量:76
采纳率:0%
帮助的人:40.1万
展开全部
基本思路:对尚未排序的各元素从头到尾依次比较相邻的两个元素是否逆序(与欲排顺序相反),若逆序就交换这两元素,经过第一轮比较排序后便可把最大(或最小)的元素排好,然后再用同样的方法把剩下的元素逐个进行比较,就得到了你所要的顺序。可以看出如果有 n 个元素,那么一共要进行 n-1 轮比较,第 i 轮要进行 j=n-i 次比较。

我也不知道你说的是用哪种语言编写:就列出了如下几种,希望你能满意
#include<stdio.h>
void main()
{
int a[10];
int i,j,t;
printf("输入10个整数:\n");
for( i = 0; i < 10; i ++ )
scanf("%d",&a[ i ]); //依次输入10个整数
for( j = 0; j < 9; j ++ ) //进行9轮排序 即n-1次
{
for( i = 0; i < 9-j; i ++) //每轮进行n-1-j 次比较,最多n-1-j 次交换
if( a[ i ] > a[ i + 1 ] )
{
t = a[ i ] ;
a[ i ] = a[ i + 1 ]; //小的沉底,大的上浮
a[ i + 1 ] = t;
}
}
printf("排序结果:");
for( i = 0; i < 10; i ++ ) //依次输出排序结果
printf("%d\t",a[ i ]);
printf("\n");
}
PASCAL为例子
procedure Bubble_Sort(var L:List);
vari,j:position;
begin
for i:=First(L) to Last(L)-1 do
for j:=First(L) to Last(L)-i do
if L[j]>L[j+1] then 4 swap(L[j],L[j+1]);
//交换L[j]和L[j+1]
end;
下面使用c++语言编写
#include<iostream.h>
void main()
{
int a[n],i,j,temp;
cout<<"请输入数字:"<<endl;
for(i=0;i<=n;i++)
cin>>a; //依次输入n个整数
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
if(a<a[j]) //利用临时变量temp交换顺序
{ temp=a[j];
a[j]=a;
a=temp;
}
cout<<a<<' '; //依次输出结果
}
下面使用Visual Basic编写
Option Explicit
Private Sub Form_Load()
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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
弥鸥逮成荫
2019-03-28 · TA获得超过3694个赞
知道大有可为答主
回答量:3074
采纳率:27%
帮助的人:214万
展开全部
冒泡排序(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),算法为稳定的排序方
编辑本段
冒泡排序代码
AAuto
bubble_sort
=
function(array){
var
temp;
for(
i=1;#array
){
//i前面的已经是最小的数,并排序好了
for(j=#array;i+1;-1){
//挨个比较
if(array[j]<array[j-1]){
//小的总是往前排
bubble
=
array[j]
array[j]
=
array[j-1];
array[j-1]
=
bubble;
}
}
}
}
io.print("----------------")
io.print("冒泡排序(
交换类换排序
)")
io.print("----------------")
array
={2;46;5;17;1;2;3;99;12;56;66;21};
bubble_sort(array,1,#array)
//输出结果
for(i=1;#array;1){
io.print(
array[i]
)
}
C
void
bubble_sort(int
*x,
int
n)
{
int
j,
k,
h,
t;
for
(h=n-1;
h>0;
h=k)
/*循环到没有比较范围*/
{
for
(j=0,
k=0;
j<h;
j++)
/*每次预置k=0,循环扫描后更新k*/
{
if
(*(x+j)
>
*(x+j+1))
/*大的放在后面,小的放到前面*/
{
t
=
*(x+j);
*(x+j)
=
*(x+j+1);
*(x+j+1)
=
t;
/*完成交换*/
k
=
j;
/*保存最后下沉的位置。这样k后面的都是排序排好了的。*/
}
}
}
}
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;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
咕噜咕噜毛1
2020-12-09 · 美食分享,晚上别看会饿
咕噜咕噜毛1
采纳数:102 获赞数:150

向TA提问 私信TA
展开全部

经典排序之冒泡排序

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(7)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式