简述冒泡排序

冒泡排序是一种比较简单的排序,就像冒泡泡一样。

比如给5个数排序,升序排列;

5 9 2 4 1;

泡泡第一次归位!!首先让泡泡在5下面;

5 9 2 4 1;

第一次 5与9比大小; 5比9小 ,不交换,泡泡冒到了9上;

5 9 2 4 1;

   。

第二次 9与2比较大小; 9比2大,交换;

5 2 9 4 1;

      。

第三次 9与4比较大小;9比4大,交换;

5 2 4 9 1;

         。

第四次 9与1比较大小;9比1大,交换;

5 2 4 1 9;

            。

此时 最大的数字已经浮出水面,第二次泡泡归位!

5 2 4 1 9;

第一次 5与2比较,5比2大,交换;

2 5 4 1 9;

   。

第二次 5与4比较,5比4大,交换;

2 4 5 1 9;

      。

第三次 5与1比较,5比1大,交换;

2 4 1 5 9;

         。

此时已经不需要比较了 在第三次时已经把 此组数中的第二大的数字选了出来!

泡泡第三次归位!

2 4 1 5 9;

第一次 2与4比较 ,2比4小 不交换,泡泡冒到了4上;

2 4 1 5 9;

   。

第二次 4与1比较,4比1大 交换;

2 1 4 5 9;

      。

此时已经把5个数中的  第三大的数字选出来了!

第四次泡泡归位!

2 1 4 5 9;

第一次 2与1比较 2比1大,交换

1 2 4 5 9;

   。

此时已经排列成功了!!

让我们总结下

每个冒泡的循环中 都将最大的那个数冒到了最后,

经过一次冒泡  比较的次数减了一,因为无需比较已经选出的最大数;

5个数字我们经过了4次泡泡归位

那么 我们将5个数字扩展到n个数字呢?

首先

要经过n-1次泡泡归位;每归一次位,比较的次数减一

如下是c语言代码

#include <stdio.h>
#include <stdlib.h>
#define n 5//宏定义一个n值
int main()
{
    int a[n]={5,9,2,4,1};
    int i;//i控制泡泡泡泡归位
    int j,t;//t为交换变量,j控制了比较的数字
    for(i=0;i<n-1;i++)
        for(j=0;j<n-1-i;j++)//每次泡泡归位 比较次数比以前减一 所以先减一再减i
    {
        if(a[j]>a[j+1])//交换条件,决定你时升序还是降序;
        {
            t=a[j+1];
            a[j+1]=a[j];
            a[j]=t;
        }
    }
    for(i=0;i<n;i++)
    {
        printf("%d",a[i]);
    }
    return 0;
}


冒泡排序-排序过程 设想被排序的数组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(n2),算法为稳定的排序冒泡排序-冒泡排序法的改进 比如用冒泡排序将4、5、7、1、2、3这6个数排序。在该列中,第二趟排序结束后,数组已排好序,但计算机此时并不知道已经反排好序,计算机还需要进行一趟比较,如果这一趟比较,未发生任何数据交换,则知道已排序好,可以不再进行比较了。因而第三趟比较还需要进行,但第四、五趟比较则是不必要的。为此,我们可以考虑程序的优化。 为了标志在比较中是否进行了,设一个布尔量flag。在进行每趟比较前将flag置成true。如果在比较中发生了数据交换,则将flag置为false,在一趟比较结束后,再判断flag,如果它仍为true(表明在该趟比较中未发生一次数据交换)则结束排序,否则进行下一趟比较。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值