冒泡排序的理解与实现【C语言、C++、java】

冒泡排序介绍

冒泡排序(Bubble Sort),又被称为气泡排序或泡沫排序。

它是一种较简单的排序算法。它会遍历若干次要排序的数列,每次遍历时,它都会从前往后依次的比较相邻两个数的大小;如果前者比后者大,则交换它们的位置。这样,一次遍历之后,最大的元素就在数列的末尾! 采用相同的方法再次遍历时,第二大的元素就被排列在最大元素之前。重复此操作,直到整个数列都有序为止!

冒泡排序图文说明

冒泡排序C实现一

void bubble_sort1(int a[], int n)
{
    int i,j;

    for (i=n-1; i>0; i--)
    {
        // 将a[0...i]中最大的数据放在末尾
        for (j=0; j<i; j++)
        {
            if (a[j] > a[j+1])
                swap(a[j], a[j+1]);
        }
    }
}

下面以数列{20,40,30,10,60,50}为例,演示它的冒泡排序过程(如下图)。

我们先分析第1趟排序
当i=5,j=0时,a[0]<a[1]。此时,不做任何处理!
当i=5,j=1时,a[1]>a[2]。此时,交换a[1]和a[2]的值;交换之后,a[1]=30,a[2]=40。
当i=5,j=2时,a[2]>a[3]。此时,交换a[2]和a[3]的值;交换之后,a[2]=10,a[3]=40。
当i=5,j=3时,a[3]<a[4]。此时,不做任何处理!
当i=5,j=4时,a[4]>a[5]。此时,交换a[4]和a[5]的值;交换之后,a[4]=50,a[3]=60。

于是,第1趟排序完之后,数列{20,40,30,10,60,50}变成了{20,30,10,40,50,60}。此时,数列末尾的值最大。

根据这种方法:
第2趟排序完之后,数列中a[5...6]是有序的。
第3趟排序完之后,数列中a[4...6]是有序的。
第4趟排序完之后,数列中a[3...6]是有序的。
第5趟排序完之后,数列中a[1...6]是有序的。

第5趟排序之后,整个数列也就是有序的了。

冒泡排序C实现二

观察上面冒泡排序的流程图,第3趟排序之后,数据已经是有序的了;第4趟和第5趟并没有进行数据交换。
下面我们对冒泡排序进行优化,使它效率更高一些:添加一个标记,如果一趟遍历中发生了交换,则标记为true,否则为false。如果某一趟没有发生交换,说明排序已经完成!

void bubble_sort2(int a[], int n)
{
    int i,j;
    int flag;                 // 标记

    for (i=n-1; i>0; i--)
    {
        flag = 0;            // 初始化标记为0

        // 将a[0...i]中最大的数据放在末尾
        for (j=0; j<i; j++)
        {
            if (a[j] > a[j+1])
            {
                swap(a[j], a[j+1]);
                flag = 1;    // 若发生交换,则设标记为1
            }
        }

        if (flag==0)
            break;            // 若没发生交换,则说明数列已有序。
    }
}

冒泡排序的时间复杂度和稳定性

冒泡排序时间复杂度

冒泡排序的时间复杂度是O(N2)。
假设被排序的数列中有N个数。遍历一趟的时间复杂度是O(N),需要遍历多少次呢?N-1次!因此,冒泡排序的时间复杂度是O(N2)。

冒泡排序稳定性

冒泡排序是稳定的算法,它满足稳定算法的定义。
算法稳定性 -- 假设在数列中存在a[i]=a[j],若在排序之前,a[i]在a[j]前面;并且排序之后,a[i]仍然在a[j]前面。则这个排序算法是稳定的!

冒泡排序实现

冒泡排序C实现
实现代码(bubble_sort.c)
 1 /**
 2  * 冒泡排序:C 语言
 3  *
 4  * @author skywang
 5  * @date 2014/03/11
 6  */
 7 
 8 #include <stdio.h>
 9 
10 // 数组长度
11 #define LENGTH(array) ( (sizeof(array)) / (sizeof(array[0])) )
12 // 交互数值
13 #define swap(a,b)    (a^=b,b^=a,a^=b)
14 
15 /*
16  * 冒泡排序
17  *
18  * 参数说明:
19  *     a -- 待排序的数组
20  *     n -- 数组的长度
21  */
22 void bubble_sort1(int a[], int n)
23 {
24     int i,j;
25 
26     for (i=n-1; i>0; i--)
27     {
28         // 将a[0...i]中最大的数据放在末尾
29         for (j=0; j<i; j++)
30         {
31             if (a[j] > a[j+1])
32                 swap(a[j], a[j+1]);
33         }
34     }
35 }
36 
37 /*
38  * 冒泡排序(改进版)
39  *
40  * 参数说明:
41  *     a -- 待排序的数组
42  *     n -- 数组的长度
43  */
44 void bubble_sort2(int a[], int n)
45 {
46     int i,j;
47     int flag;                 // 标记
48 
49     for (i=n-1; i>0; i--)
50     {
51         flag = 0;            // 初始化标记为0
52 
53         // 将a[0...i]中最大的数据放在末尾
54         for (j=0; j<i; j++)
55         {
56             if (a[j] > a[j+1])
57             {
58                 swap(a[j], a[j+1]);
59                 flag = 1;    // 若发生交换,则设标记为1
60             }
61         }
62 
63         if (flag==0)
64             break;            // 若没发生交换,则说明数列已有序。
65     }
66 }
67 
68 void main()
69 {
70     int i;
71     int a[] = {20,40,30,10,60,50};
72     int ilen = LENGTH(a);
73 
74     printf("before sort:");
75     for (i=0; i<ilen; i++)
76         printf("%d ", a[i]);
77     printf("\n");
78 
79     bubble_sort1(a, ilen);
80     //bubble_sort2(a, ilen);
81 
82     printf("after  sort:");
83     for (i=0; i<ilen; i++)
84         printf("%d ", a[i]);
85     printf("\n");
86 }
冒泡排序C++实现
实现代码(BubbleSort.cpp)
 1 /**
 2  * 冒泡排序:C++
 3  *
 4  * @author skywang
 5  * @date 2014/03/11
 6  */
 7 
 8 #include <iostream>
 9 using namespace std;
10 
11 /*
12  * 冒泡排序
13  *
14  * 参数说明:
15  *     a -- 待排序的数组
16  *     n -- 数组的长度
17  */
18 void bubbleSort1(int* a, int n)
19 {
20     int i,j,tmp;
21 
22     for (i=n-1; i>0; i--)
23     {
24         // 将a[0...i]中最大的数据放在末尾
25         for (j=0; j<i; j++)
26         {
27             if (a[j] > a[j+1])
28             {    
29                 // 交换a[j]和a[j+1]
30                 tmp = a[j];
31                 a[j] = a[j+1];
32                 a[j+1] = tmp;
33             }
34         }
35     }
36 }
37 
38 /*
39  * 冒泡排序(改进版)
40  *
41  * 参数说明:
42  *     a -- 待排序的数组
43  *     n -- 数组的长度
44  */
45 void bubbleSort2(int* a, int n)
46 {
47     int i,j,tmp;
48     int flag;                 // 标记
49 
50     for (i=n-1; i>0; i--)
51     {
52         flag = 0;            // 初始化标记为0
53 
54         // 将a[0...i]中最大的数据放在末尾
55         for (j=0; j<i; j++)
56         {
57             if (a[j] > a[j+1])
58             {
59                 // 交换a[j]和a[j+1]
60                 tmp = a[j];
61                 a[j] = a[j+1];
62                 a[j+1] = tmp;
63 
64                 flag = 1;    // 若发生交换,则设标记为1
65             }
66         }
67 
68         if (flag==0)
69             break;            // 若没发生交换,则说明数列已有序。
70     }
71 }
72 
73 int main()
74 {
75     int i;
76     int a[] = {20,40,30,10,60,50};
77     int ilen = (sizeof(a)) / (sizeof(a[0]));
78 
79     cout << "before sort:";
80     for (i=0; i<ilen; i++)
81         cout << a[i] << " ";
82     cout << endl;
83 
84     bubbleSort1(a, ilen);
85     //bubbleSort2(a, ilen);
86 
87     cout << "after  sort:";
88     for (i=0; i<ilen; i++)
89         cout << a[i] << " ";
90     cout << endl;
91 
92     return 0;
93 }
冒泡排序Java实现
实现代码(BubbleSort.java)
1 /**
 2  * 冒泡排序:Java
 3  *
 4  * @author skywang
 5  * @date 2014/03/11
 6  */
 7 
 8 public class BubbleSort {
 9 
10     /*
11      * 冒泡排序
12      *
13      * 参数说明:
14      *     a -- 待排序的数组
15      *     n -- 数组的长度
16      */
17     public static void bubbleSort1(int[] a, int n) {
18         int i,j;
19 
20         for (i=n-1; i>0; i--) {
21             // 将a[0...i]中最大的数据放在末尾
22             for (j=0; j<i; j++) {
23 
24                 if (a[j] > a[j+1]) {
25                     // 交换a[j]和a[j+1]
26                     int tmp = a[j];
27                     a[j] = a[j+1];
28                     a[j+1] = tmp;
29                 }
30             }
31         }
32     }
33 
34     /*
35      * 冒泡排序(改进版)
36      *
37      * 参数说明:
38      *     a -- 待排序的数组
39      *     n -- 数组的长度
40      */
41     public static void bubbleSort2(int[] a, int n) {
42         int i,j;
43         int flag;                 // 标记
44 
45         for (i=n-1; i>0; i--) {
46 
47             flag = 0;            // 初始化标记为0
48             // 将a[0...i]中最大的数据放在末尾
49             for (j=0; j<i; j++) {
50                 if (a[j] > a[j+1]) {
51                     // 交换a[j]和a[j+1]
52                     int tmp = a[j];
53                     a[j] = a[j+1];
54                     a[j+1] = tmp;
55 
56                     flag = 1;    // 若发生交换,则设标记为1
57                 }
58             }
59 
60             if (flag==0)
61                 break;            // 若没发生交换,则说明数列已有序。
62         }
63     }
64 
65     public static void main(String[] args) {
66         int i;
67         int[] a = {20,40,30,10,60,50};
68 
69         System.out.printf("before sort:");
70         for (i=0; i<a.length; i++)
71             System.out.printf("%d ", a[i]);
72         System.out.printf("\n");
73 
74         bubbleSort1(a, a.length);
75         //bubbleSort2(a, a.length);
76 
77         System.out.printf("after  sort:");
78         for (i=0; i<a.length; i++)
79             System.out.printf("%d ", a[i]);
80         System.out.printf("\n");
81     }
82 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/448597.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【教程】使用小米换机来迁移数据

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhang.cn] 1、在新旧手机上都下载安装小米换机app&#xff1a;小米换机-小米应用商店 2、在新手机上&#xff0c;选择旧手机类型 3、授予权限 4、在旧手机上&#xff0c;授予权限 4、输入锁屏密码 5、选择发现的新手机 6、等…

后端八股笔记------Redis

Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f447; 写锁&#x1f4…

论文笔记:Evaluating the Performance of Large Language Models on GAOKAO Benchmark

1 论文思路 采用zero-shot prompting的方式&#xff0c;将试题转化为ChatGPT的输入 对于数学题&#xff0c;将公式转化为latex输入 主观题由专业教师打分 2 数据 2010~2022年&#xff0c;一共13年间的全国A卷和全国B卷 3 结论 3.1 不同模型的zeroshot 高考总分 3.2 各科主…

Helix QAC—源码级静态自动化测试工具

Helix QAC概述 Helix QAC是一款源码级静态自动化测试工具&#xff0c;主要用于C/C代码的完全自动化静态分析工作&#xff0c;提供一个高效、健壮和自动化的环境来引入和执行编码标准。Helix QAC根据尽早、更频繁测试的理念&#xff0c;在软件生命周期最早期软件开发阶段应用识别…

03:HAL---中断

目录 一:中断 1:简历 2:AFIO 3:EXTI 4:NVIC基本结构 5:使用步骤 6:设计中断函数 二:中断的应用 A:对外式红外传感计数器 1:硬件介绍 2:计数代码 B:旋转编码计数器 1:硬件介绍 2:旋转编码器代码 C:按键控制LED D:代码总结 一:中断 1:简历 中断&#xff1a;在主程序…

数据分析-Pandas如何画图验证数据随机性

数据分析-Pandas如何画图验证数据随机性 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表…

地球系统模式(CESM)

目前通用地球系统模式&#xff08;Community Earth System Model&#xff0c;CESM&#xff09;在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来&#xff0c;一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

ctfshow web入门 php特性总结

1.web89 intval函数的利用&#xff0c;intval函数获取变量的整数值&#xff0c;失败时返回0&#xff0c;空的数组返回&#xff0c;非空数组返回1 num[]1 intval ( mixed $var [, int $base 10 ] ) : int Note: 如果 base 是 0&#xff0c;通过检测 var 的格式来决定使用的进…

论文解读:NAND闪存中读电压和LDPC纠错码的高效设计-2

在NAND闪存中&#xff0c;理论结果表明&#xff0c;LDPC解码器的性能可通过密度进化&#xff08;Density Evolution, DE&#xff09;技术进行详尽分析。针对MLC NAND闪存&#xff0c;研究者首先建立了一个离散无记忆信道模型&#xff0c;将存储单元的阈值电压划分为七个区间&am…

前端学习之HTML 下拉框 文本框

注&#xff1a;注释是对下列代码中标签的解释 下拉框 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>下拉框</title> </head> <body><!--使用&#xff1a;select标签option标…

通信总线协议之CAN-FD协议详解

文章目录 通信总线之CAN-FD总线协议详解1. CAN-FD 简介1.1 什么是CAN FD1.2 CAN FD的特点 2. CAN-FD总线协议2.1 帧起始2.2 仲裁段2.3 控制段2.4 数据段2.5 CRC段2.6 ACK段2.7 帧结束 3. 如何从传统的CAN升级到CAN FD 通信总线之CAN-FD总线协议详解 1. CAN-FD 简介 1.1 什么是…

AJAX学习(三)

版权声明 本文章来源于B站上的某马课程&#xff0c;由本人整理&#xff0c;仅供学习交流使用。如涉及侵权问题&#xff0c;请立即与本人联系&#xff0c;本人将积极配合删除相关内容。感谢理解和支持&#xff0c;本人致力于维护原创作品的权益&#xff0c;共同营造一个尊重知识…

SpringBoot 多环境的配置(附带有截图)

文章目录 概要整体配置流程配置详细说明技术细节小结 概要 多环境开发 在实际项目开发中&#xff0c;一般需要针对不同的运行环境&#xff0c;如开发环境、测试环境、生产环境等&#xff0c;每个运行环境的数据库等配置都不相同&#xff0c;每次发布测试、更新生产都需要手动…

精酿啤酒:酿造工艺的与众不同之处与魅力

Fendi Club啤酒的酿造工艺具有与众不同之处和魅力&#xff0c;这些特点使得啤酒口感与众不同、品质卓着。 Fendi Club啤酒采用与众不同的原料配方。他们精选上好麦芽、酵母和啤酒花&#xff0c;并按照与众不同的比例进行搭配。这种与众不同的原料配方为啤酒提供了丰富的口感和…

LLM推理框架Triton Inference Server学习笔记(一): Triton Inference Server整体架构初识

官方文档查阅: TritonInferenceServer文档 1. 写在前面 这篇文章开始进行大语言模型(Large Language Model, LLM)的学习笔记整理&#xff0c;这次想从Triton Inference Server框架开始&#xff0c;因为最近工作上用到了一些大模型部署方面的知识&#xff0c; 所以就快速补充了…

记一次用Arthas排查Redis连接数增加问题(附:redis连接池优化)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;https://zhangxiaofan.blog.csdn.net/article/details/136493572 前言 有一次生产环境发包后&#xff0c;发现redis连接数变多了&#xff0c;由于改的代码比较多&#xff0c;不确定是哪…

下载、安装并配置 Node.js

文章目录 1. 下载2. 自定义安装3. 添加环境变量4. 验证5. 修改下载位置6. npm 换源7. 测试 ➡️➡️➡️来源&#xff1a;Simplilearn.com Node.js 是一个开源、跨平台的 JavaScript 运行时环境和库&#xff0c;用于在客户端浏览器之外运行 web 应用程序。 Ryan Dahl 在2009年开…

2024.3.11 C++作业

1、提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数要求使用C风格字符串完成 #include <iostream>using namespace std;int main() {char str[20];cout << "please enter the str:";gets(str);in…

YoloV7改进策略:Block改进|自研Block,涨点超猛|代码详解|附结构图

涨点效果 参考模型 参考的Block,如下图: 我对Block做了修改,修改后的结构图如下: 代码详解 from timm.models.layers import DropPathfrom torch import Tensor def channel_shuffle(x: Tensor, groups:

5G CA频段组合与带宽的射频标准

先来复习一下我们前面学习过的章节后缀所代表的含义&#xff1a; None Single CarrierA Carrier Aggregation (CA)B Dual-Connectivity (DC)C Supplement Uplink (SUL)D UL MIMOE V2XF Shared spectrum channel accessG Tx Diversity (TxD)I …