排序算法(1):冒泡排序

news2024/12/23 15:33:34

        在计算机科学领域,排序算法是一个重要的主题。冒泡排序法是最基础且简单的排序算法之一,它的原理简单易懂,是学习排序算法的理想起点。本文将详细介绍冒泡排序法的原理、实现方法以及优化技巧,帮助读者全面了解和掌握这一经典算法。

一、冒泡排序原理

        冒泡排序(Bubble Sort)是一种简单且基础的排序算法。它通过多次比较和交换相邻元素来将一个序列按照升序或降序进行排序。冒泡排序法的核心思想是通过相邻元素的比较和交换,逐步将最大(或最小)的元素“冒泡”到序列的末尾。具体而言,算法从序列的第一个元素开始,比较它与下一个元素的大小关系,如果顺序不符合要求,则交换它们的位置。通过多轮遍历,每一轮都将当前未排序部分的最大(或最小)值冒泡到最后。冒泡排序的时间复杂度为O(n^2),其中n是序列的长度。

二、冒泡排序法的实现

        下面我们以升序排序为例,详细介绍冒泡排序法的实现步骤:
         1.初始化序列和标志位:
        (1)定义一个包含待排序元素的序列;
        (2)设置一个标志位,用于判断是否进行了交换操作。
         2.进行多轮遍历:
        (1)外层循环控制总共需要进行的轮次,从0到n-1。
        (2)内层循环用于每一轮的比较和交换操作,从0到n-1-i,其中i是当前轮次。
        3.比较相邻元素并交换:
        (1)比较当前元素和下一个元素的大小关系。
        (2)如果当前元素大于下一个元素,则交换它们的位置。
        4.标志位优化:如果一轮遍历中没有进行过交换操作,说明序列已经有序,可以提前结束排序。
        5.返回排序后的序列。

三、冒泡排序法的程序

        程序主要包括:定义了冒泡排序函数bubbleSort,以及在main函数中的数组初始化、打印排序前的数组、调用排序函数进行排序、打印排序后的数组等操作。它以最快的方法每次把元素放置末尾。

         程序代码如下:

#include <stdio.h>

// 冒泡排序
void bubbleSort(int arr[], int size) {
    for (int i = 0; i < size - 1; i++) {  // 外层循环控制遍历的轮次,共进行 size - 1 轮
        for (int j = 0; j < size - i - 1; j++) {  // 内层循环用于比较和交换相邻元素
            if (arr[j] > arr[j + 1]) {  // 如果当前元素大于下一个元素,进行交换
                // 交换元素位置
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

int main() {
    int arr[] = {9, 5, 2, 7, 1, 6, 3, 8, 4};  // 待排序的数组
    int size = sizeof(arr) / sizeof(arr[0]);  // 数组的大小

    printf("排序前的数组:");
    for (int i = 0; i < size; i++) {  // 打印排序前的数组
        printf("%d ", arr[i]);
    }
    printf("\n");

    bubbleSort(arr, size);  // 调用冒泡排序函数进行排序

    printf("排序后的数组:");
    for (int i = 0; i < size; i++) {  // 打印排序后的数组
        printf("%d ", arr[i]);
    }
    printf("\n");

    return 0;
}

四、冒泡排序法的优化

        尽管冒泡排序法简单易懂,但在实际应用中对于大规模数据的排序效率较低。为了改进算法的性能,我们可以尝试一些优化方法:

        1.设置有序区域标记:在每一轮遍历中,记录最后一次发生交换的位置。这个位置之后的元素已经有序,不需要再比较。


        2.提前结束排序:在每一轮遍历中,如果没有进行过交换操作,说明序列已经有序,可以提前结束排序。


        3.双向冒泡排序:在每一轮遍历中,除了从左往右比较和交换,还可以从右往左进行一轮比较和交换。这样可以同时找到最大值和最小值,减少遍历次数。

        4.鸡尾酒排序:双向冒泡排序的一种变体,从左到右和从右到左交替进行遍历。适用于部分有序的序列。
        这些优化方法可以提高冒泡排序法的效率,但无论如何优化,冒泡排序的最坏情况时间复杂度仍然是O(n^2)。因此,在实际应用中,对于大规模数据的排序,我们通常会选择其他更高效的排序算法。

五、总结

        冒泡排序法作为最基础的排序算法之一,为我们理解和学习其他排序算法奠定了基础。通过深入理解冒泡排序法的原理、掌握实现方法以及了解优化技巧,我们可以更好地应用它,并能够更好地理解其他高级排序算法。尽管冒泡排序法在实际应用中的效率有限,但通过对排序算法的学习和探索,我们能够发现更多高效的算法。

        今天的分享就到这里啦~

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重新安装conda时报错

自己因为最近利用 conda 安装了比较多的软件,在输入创建环境时&#xff1a; conda create -n python27 python2.7 报错&#xff0c;环境创建不成功。 显示 miniconda3 文件夹已存在 &#xff08;因为安装时会默认安装至此目录&#xff0c;如果此目录已经存在则会冲突报错&…

【基础算法】贪心算法

贪心算法又称贪婪算法&#xff0c;是一种常见的算法思想。贪心算法的优点是效率高&#xff0c;实现较为简单&#xff0c;缺点是可能得不到最优解。 贪心算法的基本思想 贪心算法就是在求解问题时&#xff0c;总是做出当前看来最好的选择。也就是说贪心算法并不从整体最优上考…

word转PDF后图片为何会变小?怎么解决?

有些同学反映将Word文档转换为PDF后&#xff0c;发现里面的图片居然变小了&#xff0c;这是什么原因造成的&#xff1f;该怎么解决呢&#xff1f; 先来说说原因&#xff0c;我个人认为可能是由以下原因造成的&#xff1a; 1、word插入图片后压缩“太狠”了。当你在word中插入…

GENMARK控制器维修S08S4P.D工业电脑维修

机器人GENMARK SYSTEM CONTROLLER系统控制器维修S08S4P.D工业电脑&#xff1b;晶圆转移机器人SΛΛALL CONTROLLER&#xff1b; SΛΛC1100 半导体设备机械臂GENMARK控制器等 GenMark的两大构架&#xff1a;eSensor&#xff08;电子传感&#xff09;和Elecitrowetting&#xf…

ibaq intensity 蛋白组学 蛋白质组学两个定量方法(iBAQ和LFQ)的区别及常见的标准化方法

4.MaxQuant中的Intensity&#xff0c;LFQ和iBAQ 大佬的软件&#xff0c;三种定量算法都发了文章。 Intensity是将某Protein Groups里面的所有Unique和Razor peptides的信号强度加起来&#xff0c;作为一个原始强度值。用得很少。iBAQ是在Intenstiy的基础上&#xff0c;将原始…

JUC#线程池加锁逻辑梳理

带着问题看源码 为什么要用线程池?Java是实现和管理线程池有哪些方式? 请简单举例如何使用。为什么很多公司不允许使用Executors去创建线程池? 那么推荐怎么使用呢?ThreadPoolExecutor有哪些核心的配置参数? 请简要说明ThreadPoolExecutor可以创建的是哪三种线程池呢?当…

【Web3】Web3Js高频Api

目录 Web3Js方法 初始化Web3实例 Web3Api 创建账号Api 获取余额Api 单位转换工具函数 Web3Js方法 web3.eth&#xff1a;用于与以太坊区块链和智能合约之间的交互。 web3.utils&#xff1a;包含一些辅助方法。 web3.shh&#xff1a;用于协议进行通信的P2P和广播。 web3…

1066 Root of AVL Tree (PAT甲级)

这道题类似1123题。 #include <cstdio> #include <algorithm>struct node{int key;node* left nullptr;node* right nullptr; };int N, t; node* root nullptr;int getHeight(node* r){if(!r){return 0;}return std::max(getHeight(r->left), getHeight(r-&…

【json-server】json-server安装与使用:

文章目录 一、下载安装:二、启动db.json数据及相关参数&#xff1a;三、创建json数据——db.json&#xff1a;四、修改端口号&#xff1a;五、操作数据&#xff1a;【1】常规获取&#xff1a;【2】过滤获取 Filter:【3】分页 Paginate&#xff1a;【4】排序 Sort&#xff1a;【…

使用 .editorconfig 文件来统一编程风格

做过长期开发的程序员都知道保持编程风格统一的重要性, 统一的风格能够降低各种成本. 有一句名言是咋说的来着? 代码主要是给人看的, 其次才是给电脑去运行. 但另一方面, 大家又普遍是偷懒的, 对于这些长期会受益, 但短期收益不明显甚至带来麻烦的事, 许多团队中的成员不能说抵…

产品经理进阶:硬件产品定价指南

目录 介绍 基于成本的定价 基于市场的定价 基于价值的定价 总结一下 CSDN学员课程 优惠活动通知 介绍 定价本身其实是一个相对复杂的过程。 因为有很多变量会影响到你最终的定价。 比如说&#xff1a;客户的维度、竞争对手的维度、成本的维度等等。 但是无论如何&am…

Impala3.4源码阅读笔记(三)data-cache的Store实现

前言 本文为笔者个人阅读Apache Impala源码时的笔记&#xff0c;仅代表我个人对代码的理解&#xff0c;个人水平有限&#xff0c;文章可能存在理解错误、遗漏或者过时之处。如果有任何错误或者有更好的见解&#xff0c;欢迎指正。 正文 本文顺承前文Impala3.4源码阅读笔记&a…

mac电脑上,webm格式怎么转换成mp4?

mac电脑上&#xff0c;webm格式怎么转换成mp4&#xff1f;webm格式的视频也是最近几年也越来越多的&#xff0c;小编最近就不止一次的下载到过webm格式的视频&#xff0c;很多小伙伴肯定对它还并不是很了解&#xff0c;webm是由谷歌公司所提出以及开发出来的视频文件格式&#…

matlab读取STK生成的报告

一、STK 和 Matlab的生成的图片对比 &#xff08;一&#xff09;STK图片 &#xff08;二&#xff09;Matlab图片 &#xff08;三&#xff09;STK生成的报表数据 "Time (UTCG)","Azimuth (deg)","Elevation (deg)","Range (km)" 20 J…

编译Android平台的OpenCV库并启用OpenCL及Contrib

1.下载好OpenCV与OpenCV_Contirb 版本: 4.7 编译主机系统: Ubuntu 20.04 LTS 准备环境与工具: ANDRIOD SDK 与 NDK ,CMAKE ,NINJA ,GCC,G++ ,MAKE 开始编译: ../opencv/platforms/android/build_sdk.py --extra_modules_path=../opencv_contrib/modules --no_samples_bu…

坚固型3DMAG™ A31315LOLATR-XZ-S-SE-10、A31315LOLATR-XY-S-AR-10霍尔效应磁性位置传感器IC

A31315 3D磁性位置传感器IC是完全集成的坚固型3DMAG™ 霍尔效应磁性位置传感器IC&#xff0c;主要用于支持汽车、工业和消费类应用中的各种非接触式旋转和线性位置测量。 A31315传感器IC集成了垂直和平面霍尔效应元件&#xff0c;可检测三个磁场分量&#xff08;X、Y和Z&#x…

spring如何使用junit进行测试

第一步maven的pom.xml引入坐标&#xff1a; <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version></dependency> 第二步编写测试方法&#xff1a; 第三步 定义scope类型

gpt4实现对摄像头帧缓冲区图像的LAB阈值选择界面(python-opencv)

代码全是GPT4写的&#xff0c;我就提出Prompt和要改的地方而已。 图形界面效果 代码 import cv2 import numpy as np import time from tkinter import * from PIL import Image, ImageTkclass App:def __init__(self, window, window_title, video_source0):self.window wi…

【面试】美团面试真题和答案

文章目录 前言1.线程池有几种实现方式&#xff1f;2.线程池的参数含义&#xff1f;3.锁升级的过程&#xff1f;4.i 如何保证线程安全&#xff1f;5.HashMap和ConcurrentHashMap有什么区别&#xff1f;6.Autowired和Resource区别&#xff1f;7.说说常用的设计模式8.Redis为什么这…

react中使用 websocket

react中使用 websocket&#xff0c;使用socket.io库 参考官网地址&#xff1a; https://socket.io/zh-CN/docs/v4/client-installation/#from-npm 1.安装 npm install socket.io-client2.示例代码 import React, { useEffect, useRef, useState } from "react"; i…