排序算法--冒泡排序

embedded/2024/10/18 0:34:41/

前提:

      交换排序:根据序列中两个值的比较结果来交换这两个数在序列中的位置,交换排序的特点是:将值较大的数向序列的尾部移动,值较小的数向序列的前部移动。

算法分析:

     冒泡排序,英语名是Bubble Sort,是一种最基础的交换排序。这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。所以数据就像气泡一样,根据大小一点一点的移动。

看动图:

举个例子:

 

单趟排序:目的将最大的排到最右边

  比较3和9:

比较9和7:

比较9和4:

比较9和11:

比较11和4:

单趟最终:

将最大的11挪到最右边。

如上面的单趟排序:

 

第五次排序实际上就已经有序了

  根据上面的分析:

void Swap(int* p1, int* p2)
{int tmp = *p1;*p1 = *p2;*p2 = tmp;
}void BubbleSort(int* a, int n)
{for (int j = 0; j < n; j++){for (int i = 1; i < n-j; i++){if (a[i - 1] > a[i]){Swap(&a[i - 1], &a[i]);}}}//i=0也可以,i=0时,i<n-1-j;比较的是a[i]与a[i+1];

这里使用双循环进行排序。外面的循环控制所有回合,内部循环是单趟排序,将最大的移到右边,如果a[i-1]比a[i]小,两数就交换。

 时间复杂度:

冒泡排序是稳定的,算法时间复杂度是O(n ^2)。

由于冒泡排序的每一轮都要遍历一遍所有的元素,轮转的次数和元素数量相当,所以时间复杂度为O(N^2)。

 冒泡排序时间复杂度最好是多少呢?O(n)?

 假如整个数组有序,冒泡排序遍历一遍确实是O(n)。但是上面的代码可以实现吗?计算机怎么知道完全有序呢?所以要想O(n),我们还需要给一个标志:

我们给定一个标志exchange,将exchange设置为false。如果这次排序交换了数据,exchange发生变化。如果没发生变化,说明整个数组已经有序,就退出循环。

 


http://www.ppmy.cn/embedded/28004.html

相关文章

【16-Ⅰ】Head First Java 学习笔记

HeadFirst Java 本人有C语言基础&#xff0c;通过阅读Java廖雪峰网站&#xff0c;简单速成了java&#xff0c;但对其中一些入门概念有所疏漏&#xff0c;阅读本书以弥补。 第一章 Java入门 第二章 面向对象 第三章 变量 第四章 方法操作实例变量 第五章 程序实战 第六章 Java…

云计算与云服务

什么是云计算 云计算是指通过 Internet 提供的计算服务。 计算服务包括常见的 IT 基础结构&#xff0c;例如虚拟机、存储、数据库和网络。 云服务还扩充了传统的 IT 产品/服务&#xff0c;包括物联网 (IoT)、机器学习 (ML) 以及人工智能 (AI) 等。 定义云模型 什么是云模型&…

Mac Word文档没保存但是word突然卡住

参考博客的解决方案&#xff1a; https://www.jianshu.com/p/148cf8c9571d 思路&#xff1a;通过活动监视器找到Microsoft word的程序启动地址&#xff0c;在前往-前往文件夹中输入地址&#xff0c;到程序所在的文件夹&#xff0c;双击启动一个新的word程序&#xff0c;将当前…

iOS(Object C) 递归方法求和

有等差数列1,2,3,4,5使用递归方法求和: - (int)sum:(int)value {if (value >5){return self.count;}//在外面定义一个全局变量self.count,初始值为0self.count [self sum:value1] value;return self.count; } 调用验证: self.count 0; int result [self sum:1]; 不一…

iview 自定义项求和的方法和错误点

这是iview自定义某几项参数合计的方法&#xff0c;其实是蛮简单的&#xff0c;很多人自定义合计的时候&#xff0c;老是会不知道怎么处理除了需要合计的几项的其他项&#xff0c;其实不需要管&#xff0c;不需要合计的项直接返回空就好了&#xff0c;需要的就在计算的里面做key…

Laravel breeze vs Jetstream

Introduction Laravel在应用程序中提供了几种身份验证选项&#xff0c;为我们的身份验证层提供了一个健壮而现代的脚手架。Laravel入门工具包就是其中之一&#xff0c;它由breeze和jetstream组成。 Laravel Breeze是快速运行程序的绝佳选择&#xff0c;jetstream提供双因素认…

第三章、汇编1

编译选项知识 -Og&#xff1a;这是 GCC 和 Clang 编译器提供的优化选项之一。-Og 的含义是“优化级别为 g”&#xff0c;其中的 “g” 代表了"g优化"。这个选项的作用是启用一些基本的优化&#xff0c;以尽量保持生成的代码易读易调试。它通常会保留变量名和源代码结…

aardio封装库) 微软开源的js引擎(ChakraCore)

前言 做爬虫肯定少不了JavaScript引擎的使用&#xff0c;比如在Python中现在一般用pyexecjs2来执行JavaScript代码&#xff0c;另外还有一些其他执行JavaScript的库&#xff1a; https://github.com/eight04/node_vm2: rpc调用nodejs&#xff0c;需要安装nodehttps://github.…