算法笔记 冒泡排序

排序是指将一个无序序列按某个规则进行有序排列,而冒牌排序是排序算法中最基础的一种。先给出一个序列a,其中元素的个数为n,要求将他们按从小到大的顺序排序。
冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一端,而当剩余元素减少为0时,排序结束。为了使排序过程更加清楚,举个例子。
现在有一个数组a,其中有5个元素,分别为a[0] = 3,a[1] = 4,a[2] = 1,a[3] = 5,a[4] = 2,要求把它们按从小到大的顺序排列。下面的过程中,每趟将最大数交换到最右边:
(1)第一趟
a[0]与a[1]比较(3与4比较),a[1]大,因此不懂,此时序列为{3,4,1,5,2};
这里写图片描述
a[1]与a[2]比较(4与1比较),a[1]大,因此把a[1]和a[2]交换,此时序列为{3,1,4,5,2}
这里写图片描述
a[2]与a[3]比较(4与5比较),a[3]大,因此不动,此时序列为{3,1,4,5,2};
这里写图片描述
a[3]与a[4]比较(5与2比较),a[4]大,因此把a[3]和a[4]交换,此时序列为{3,1,4,2,5};
这里写图片描述

由此,第一趟排序结束,共进行了四次比较。
(2)第二趟
a[0]和a[1]比较(3与1比较),a[0]大,因此把a[0]和a[1]交换,此时序列为{1,3,4,2,5}
这里写图片描述
a[1]和a[2]比较(3与4比较),a[2]大,因此不动,此时序列为{1,3,4,2,5}
这里写图片描述
a[2]和a[3]比较(4与2比较),a[2]大,因此把a[2]和a[3]交换,此时序列为{1,3,2,4,5}
这里写图片描述
由此,第二趟排序结束,共进行了三次比较。
(3)第三趟
a[0]和a[1]比较(1与3比较),a[1]大,因此不动,此时序列为{1,3,2,4,5}
这里写图片描述
a[1]和a[2]比较(3与2比较),a[1]大,因此把a[1]和a[2]交换,此时序列为{1,2,3,4,5}
这里写图片描述
由此,第三趟排序结束,共进行了两次比较。
(4)第四趟
a[0]和a[1]比较(1与2比较),a[1]大,因此不动,此时序列为{1,2,3,4,5}
这里写图片描述

由此,第四趟排序结束,共进行了一次比较。
至此,已经无法在继续比较,序列已经有序,冒泡排序结束。
下面来看看如何实现,先来学习如何交换两个数(借助中间变量)。

#include<stdio.h>
int main(){
    int a = 1,b = 2;
    int temp = a;
    a = b;
    b = temp;
    printf("a = %d, b = %d\n",a,b);
    return 0;
}

输出结果:

a = 2,b= 1

然后实现冒泡排序。

#include<stdio.h>
int main(){
    int a[5] = {3,1,4,5,2};
    for(int i = 1;i <= 4;i ++){
        for(int j = 0;j < 5 - i;j++){
            if(a[j] > a[j + 1]){
                int temp = a[j];
                a[j] = a[j + 1];
                a[j + 1] = temp;
            }
        }
    }
    for(int i = 0;i < 5;i++){
        printf("%d ",a[i]);
    }
    return 0;
}

输出结果:

1 2 3 4 5

摘录自《算法笔记》胡凡,曾磊主编

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值