从深水区开始冒泡

2024-03-27 03:40
文章标签 冒泡 深水

本文主要是介绍从深水区开始冒泡,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一. 冒泡算法基本思想


冒泡排序也称为交换排序算法,从一组无序的队列,通过相邻的两个元素进行两两比较,根据大小交换位置,筛选最大或者最小的元素到有序队列的尾部,周而复始,直到整个队列的元素从无序变成有序。 

二. 冒泡算法核心逻辑


1. 以升序为例子,筛选最大的元素到队列尾部,默认队列为 [ 435]

2. 以4作为最大元素开始,跟3作比较,43大,43交换,交换后的队列为[ 345]

3. 4继续跟5作比较,45小,不交换位置,最大元素变为5

4. 以5作为最大元素,继续跟2做比较,52大,交换位置,5作为最大值已到达队列尾部,成为有序队列的一部分,队列为 [ 342]

5. 3开始作为最大元素,跟相邻4作比较,34小,不交换位置,最大元素变为4

6.  以4作为最大元素,继续跟相邻元素2作比较,42大,交换位置,交换后队列为[ 324]

7. 4继续跟相邻元素5作比较,由于5是有序队列的一部分,因此4成为了有序队列的一部分,队列为[ 324]

8. 3开始作为最大元素,跟相邻的2作比较,32大,交换位置,交换后队列为[ 234]

9. 3继续跟相邻元素4作比较,由于4是有序队列的一部分,因此3成为了有序队列的一部分,队列为[ 234]

10. 2开始作为最大元素,跟相邻3作比较,由于3是有序队列的一部分,因此2成为有序队列的一部分,队列为[ 234]

11. 最终整个无序的队列变成了有序的队列 [ 234]

三. 冒泡算法图示

四. 冒泡算法代码

 1. 基础冒泡排序

        public static void BubbleSort(){int[] arrays = new[] { 4, 3, 5, 2 };//元素队列for (int i = 0; i < arrays.Length; i++) //外层循环把队列的每一元素参与运算{for (int j = 0; j < arrays.Length - 1; j++)  //内层循环把队列最大值移动到队列尾部,成为有序队列的一部分{if (arrays[j] > arrays[j + 1]) //作比较,交换元素{int temp = arrays[j + 1];//临时变量arrays[j + 1] = arrays[j];//交换元素arrays[j] = temp; }}}}

 

2. 优化冒泡排序,添加标志向量

        public static void OptimizeBubbleSortInLabel(){int[] arrays = new[] { 4, 3, 5, 2 };bool change = false; //添加标志变量for (int i = 0; i < arrays.Length; i++){for (int j = 0; j < arrays.Length - 1; j++){if (arrays[j] > arrays[j + 1]){int temp = arrays[j + 1];arrays[j + 1] = arrays[j];arrays[j] = temp;change = true;//发生交换,说明队列存在无序情况}}if (!change) break;//没有发生交换就中断,队列已经有序}}

 3. 优化冒泡排序,减少交换次数

        /// <summary>/// 优化冒泡排序执行次数,忽略有序队列,对无序队列进行排序,内层循环减去已经排序好的数量。/// </summary>/// <param name="arrays"></param>public static void OptimizeBubbleSortInCount(){int[] arrays = new[] { 4, 3, 5, 2 };//元素队列bool change = false;for (int i = 0; i < arrays.Length; i++){for (int j = 0; j < arrays.Length -1-i; j++) //减去有序队列,只对无序队列进行交换{if (arrays[j] > arrays[j + 1]){int temp = arrays[j + 1];arrays[j + 1] = arrays[j];arrays[j] = temp;change = true;}}if (!change) break;}}

五. 冒泡算法性能分析(以第四部分第3代码为例子)

1. 冒泡排序时间复杂度

  •       在正序的特殊情况下,例如[1,2,3,4,5],经过n-1次的比较,没有元素交换,也就是冒泡排序在最好的情况下的时间复杂度是O(n)
  •       在逆序的特殊情况下,例如[5,4,3,2,1],经过n(n-1)/2次的比较,期间发生了3n(n-1)/2次的交换,这是冒泡排序在最坏情况下的时间复杂度O(n^2)
  •       在杂乱无序的正常情况下,例如[4,3,5,1,2],冒泡排序的平均时间复杂度为O(n^2)

 2.冒泡排序的空间复杂度

  •       冒泡排序在作比较时,需要一个临时变量存储元素,所以冒泡排序的空间复杂度为O(1)

3.冒泡排序的稳定性

  •       冒泡排序在作交换时,相同的元素不改变位置,这是一种稳定的排序算法

 4.算法时间和空间复杂度推导的相关文章https://www.jianshu.com/p/f4cca5ce055a

这篇关于从深水区开始冒泡的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850828

相关文章

js事件冒泡原理

就是当设定了多个div的嵌套时;即建立了父子关系,当父div与子div共同加入了onclick事件时,当触发了子div的onclick事件后,子div进行相应的js操作。但是父div的onclick事件同样会被触发。这就造成了事件的多层并发,导致了页面混乱。这就是冒泡事件。 冒泡会逐级往上冒,从div到body到html到document。

js mouseup和mousedown 阻止冒泡事件-解决方法

主要看id为c4, 核心思路:比如当前你要点击一个a标签跳转到别的地方,鼠标按下去后(还没松开),突然不想点了,然后把鼠标移到别处去,然后,a标签是不会被触发的,这里用的就是这个思路。 <!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><style type="text/css">body{width:100

js 绑定事件,冒泡事件,默认事件

addEventListener 定义:addEventListener() 方法用于向指定元素添加事件句柄。 element.addEventListener(event, function, useCapture)/**useCapture:1.可选。布尔值,指定事件是否在捕获或冒泡阶段执行。2.true - 事件句柄在捕获阶段执行3.false- 默认。事件句柄在冒泡阶段执行*///

排序:插入排序/选择排序/交换排序(冒泡法)

1.插入排序: template <class T>void insertionSort(T a[], int n) {int i, j;T temp;for (int i = 1; i < n; i++) { int j = i;T temp = a[i];while (j > 0 && temp < a[j - 1]) {a[j] = a[j - 1];j--;}a[

dom练习题-全选反选、可展开子菜单、事件冒泡、二级联动、表格增删、定时器、多事件绑定

checkbox全选反选可展开菜单事件冒泡二级联动菜单表格增删定时器多事件绑定 checkbox全选、反选 <!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>作业分解小礼包</title><style></style><script>// 全选function checkAll(

前端宝典十八:高频算法排序之冒泡、插入、选择、归并和快速

前言 十大经典排序算法的 时间复杂度与空间复杂度 比较。 名词解释: n:数据规模;k:桶的个数;In-place: 占用常数内存,不占用额外内存;Out-place: 占用额外内存。 本文主要探讨高频算法排序中的几个常见的冒泡、插入、选择、归并和快速 冒泡排序和选择排序是最常见的两种排序,语法简单,容易实现,冒泡排序、插入排序和选择排序虽然在时间复杂度上相对较高,但对于小规模数据或者

数据结构——冒泡、选择、插入和希尔排序

目录 引言 冒泡排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 选择排序 1.算法思想 2.算法步骤 3.代码实现 (1)优化前 (2)优化后 4.复杂度分析 插入排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 希尔排序 1.算法思想 2.算法步骤 3.代码实现 4.复杂度分析 结束语 引言 在数据处理、算法优

checkbox 复选框 冒泡事件

1.问题描述:点击checkbox 会触发父元素的事件,使用@click.stop无效 解决办法:多加一层div,在div上使用@click.stop 2.小程序的checkbox点击时会冒泡,触发父元素的事件 解决办法:给checkbox绑定一个catchtap,指向空事件,阻止事件冒泡,如:catchtap=“checkEvent”,checkEvent定义一个空事件 3.常见的事件修

冒泡算法排序数组

function c=bubble_sort(a)% 冒泡算法% Written by Phillip Wan @ 2013.9.11% Email:hackerwanhappy@foxmail.comfor j=1:length(a)-1for i=1:length(a)-1if a(i)>a(i+1)test=a(i);a(i)=a(i+1);a(i+1)=test;endende

数据结构之排序(冒泡,选择,插入,快排)

冒泡排序:--------------------------------------------------------- #include <stdio.h> #define SIZE 8   void bubble_sort(int a[], int n);   void bubble_sort(int a[], int n) {     int i, j, temp;     for (