帮助快速理解上手冒泡排序

简介: 帮助快速理解上手冒泡排序

 目录

前言

经典冒泡排序

冒泡排序的优化:


前言

对初学者来说,冒泡排序是很难理解的一个点,那么希望这篇文章可以对你理解冒泡排序有所帮助

经典冒泡排序

题目:给定一串数字,进行由大到小的排序


算法:令数组中的前两个数字进行大小比较,看作为左右两个数,进行大小比较后使得数字较大的数字始终在右边的位置,下一轮比较时再让这个数字和右边的数字继续比较,依次比较直到这串数组的最后一个字符,这样我们就能通过这一操作让这串字符串中最大的一个数字放到字符串的最后一个位置,这样就完成了一趟,其余数字依次进行即可

以下为完整代码:


#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
  int temp = 0;
  int i, j;
  for (i = 0; i < sz - 1; i++)
  {
    for (j = 0; j < sz - 1 - i; j++)
    if (arr[j] > arr[j + 1])
    {
    temp = arr[j+1];
     arr[j + 1] = arr[j];
     arr[j] = temp;
    }
  }
}
int main()
{
  int arr[] = {10,9,8,7,6,5,4,3,2,1};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  bubble_sort(arr, sz);
//数组传参只会传首地址,即&arr[0],所以要提前传递sz
  for (i = 0; i < sz; i++)
  printf("%d ", arr[i]);
  printf("\n");
  return 0;
}

image.gif


在实际比较中会遇见这样的情况,如果给定的数组是9 1 2 3 4 5 6 7 8,那么实际上我们只需要进行一次循环就已经排序完成了,若运行上述程序还会接着进行循环,直到最后一个数字被比较

我们可以对程序略加优化:我们可以引入一个flag的变量,当左边的数字大于右边时会进入循环,此时flag会变成0,当结束这一趟循环时flag又会被赋为1,若接下来的数字没有进入if循环,则说明已经不再需要后续比较了,此时flag仍为1,那么我们就可以直接break跳出循环,这样可以作为一个优化


冒泡排序的优化:

以下为优化后的结果:

int main()
{
    int a[10], i, j, n;
    printf("输入10个数:");
    for (i = 1; i <= 10; i++)
        scanf("%d", &a[i]);
    for (i = 1; i <= 10; i++)
        for (j = i; j <= 10; j++)
        {
            if (a[i] > a[j])
            {
                n = a[i];
                a[i] = a[j];
                a[j] = n;
            }
        }
    printf("该十个数升序为: ");
    for (i = 1; i <= 10; i++)
        printf("%2d", a[i]);
}
#include <stdio.h>
void bubble_sort(int arr[], int sz)
{
  int temp = 0;
  int i, j;
  for (i = 0; i < sz - 1; i++)
  {
    int flag = 1;
    for (j = 0; j < sz - 1 - i; j++)
    if (arr[j] > arr[j + 1])
    {
    temp = arr[j+1];
     arr[j + 1] = arr[j];
     arr[j] = temp;
     flag = 0;
    }
    if (flag == 1)//对代码进行优化,如果已经达到顺序则不再进行排序
      break;
  }
}
int main()
{
  int arr[] = {10,9,8,7,6,5,4,3,2,1};
  int sz = sizeof(arr) / sizeof(arr[0]);
  int i = 0;
  bubble_sort(arr, sz);
//数组传参只会传首地址,即&arr[0],所以要提前传递sz
  for (i = 0; i < sz; i++)
  printf("%d ", arr[i]);
  printf("\n");
  return 0;
}

image.gif


相关文章
|
网络协议 Linux 网络安全
iptables 的四表五链
iptables 是 Linux 系统上用于定义防火墙规则的工具,它通过四个表和五个链来进行配置。下面是这些表和链的详细说明: 四个表: 1. filter 表:filter 表是最常用的表,用于过滤数据包。它包含了 INPUT、OUTPUT 和 FORWARD 三个默认的链。 2. nat 表:nat 表用于网络地址转换 (NAT)。它包含了 PREROUTING、POSTROUTING 和 OUTPUT 三个默认的链。nat 表用于修改数据包的 IP 地址和端口。 3. mangle 表:mangle 表用于修改数据包的特定字段,如 TTL(生存时间)、TOS(服务类型)等。它包含了
452 1
|
6月前
|
数据采集 算法 数据安全/隐私保护
【硬件测试】基于FPGA的16QAM调制+软解调系统开发与硬件片内测试,包含信道模块,误码统计模块,可设置SNR
本文基于之前开发的16QAM调制与软解调系统,增加了硬件测试功能。该系统包含FPGA实现的16QAM调制、软解调、高斯信道、误码率统计模块,并新增了ILA在线数据采集和VIO在线SNR设置模块。通过硬件测试,验证了不同SNR条件下的系统性能。16QAM软解调通过比较接收信号采样值与16个调制点的距离,选择最近的调制点来恢复原始数据。核心Verilog代码实现了整个系统的功能,包括SNR设置、信号处理及误码率统计。硬件测试结果表明系统在不同SNR下表现良好,详细操作步骤可参考配套视频。
150 13
|
Python
【金融量化】通道突破策略之布林带策略(Bollinger Band )、肯特纳通道策略(Keltner Channel)、唐奇安通道策略(Donchian)原理简介
本文介绍了三种金融量化分析中的通道突破策略:布林带策略(Bollinger Band)、肯特纳通道策略(Keltner Channel)和唐奇安通道策略(Donchian Channel),并提供了每种策略的原理和Python实现代码。
794 2
|
10月前
|
NoSQL Java API
springboot项目Redis统计在线用户
通过本文的介绍,您可以在Spring Boot项目中使用Redis实现在线用户统计。通过合理配置Redis和实现用户登录、注销及统计逻辑,您可以高效地管理在线用户。希望本文的详细解释和代码示例能帮助您在实际项目中成功应用这一技术。
345 4
|
10月前
|
人工智能 自然语言处理 测试技术
文生图参数量升至240亿!Playground v3发布:深度融合LLM,图形设计能力超越人类
【10月更文挑战第29天】Playground v3(PGv3)是最新发布的文本到图像生成模型,其在多个测试基准上取得了最先进的性能。与传统模型不同,PGv3采用了一种全新的结构,将大型语言模型与图像生成模型深度融合,展现出卓越的文本提示遵循、复杂推理和准确的文本渲染能力。此外,PGv3还具备超越人类的图形设计能力,支持精确的RGB颜色控制和多语言理解,为设计师和创意工作者提供了强大的工具。尽管存在一些挑战,但PGv3的发布标志着文本到图像生成技术的重大突破。
187 6
|
11月前
|
设计模式 缓存 C#
适配器模式与桥接模式:一分钟浅谈
【10月更文挑战第14天】本文介绍了面向对象设计中的适配器模式和桥接模式,包括它们的概念、应用场景、实现方式及常见问题。适配器模式通过接口转换解决不兼容问题,适用于系统扩展和遗留系统升级;桥接模式通过分离抽象和实现提高灵活性,适用于多维度变化和避免类爆炸。文中还提供了C#代码示例以加深理解。
134 3
|
数据采集 存储 数据库
从零到一建设数据中台(番外篇)- 数据中台UI欣赏
从零到一建设数据中台(番外篇)- 数据中台UI欣赏
193 0
从零到一建设数据中台(番外篇)- 数据中台UI欣赏
|
存储 缓存 NoSQL
软件体系结构 - 缓存技术(4)Redis分布式存储
【4月更文挑战第20天】软件体系结构 - 缓存技术(4)Redis分布式存储
175 12
|
机器学习/深度学习 API iOS开发
iOS MachineLearning 系列(17)—— 几个常用的对象识别 CoreML 模型
上一篇文章中,我们介绍了几个官方的图片分类的模型,图片分类模型的应用场景在于将图片中最主要的事物进行识别,在已有的词库中找到最可能得事物。而对象识别则要更高级一些。再之前的文章,我们介绍过可以使用官方提供的API来进行矩形识别,文本识别,二维码识别以及人脸识别等,这类识别功能的特点是我们不仅可以将图片中的物体位置和尺寸分析出来,还可以对其进行类别的分类。
495 0
|
存储 C语言
C语言程序设计——ASCII码
C语言程序设计——ASCII码