JS排序之冒泡排序详解

JS排序之冒泡排序详解

简介

冒泡排序是最基本,也是最容易实现的排序算法之一。它的基本思想是通过多次循环遍历数组,每次比较相邻两个元素的大小,如果发现顺序不对,就交换它们的位置,通过多次遍历和交换的操作,最终使得整个数组变得有序。

基本思路

  1. 遍历数组,将相邻元素的大小进行比较,如果前面元素大于后面元素,则交换它们的位置;
  2. 继续以相同的方式遍历数组,直到数组中的每个元素都已参加了比较。

算法分析

  • 时间复杂度:O(n^2)
  • 空间复杂度:O(1)

代码实现

function bubbleSort(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    for (var j = 0; j < len - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        var temp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}

示例解析

示例1:从小到大排序

var arr = [3, 1, 4, 2, 5];
console.log(bubbleSort(arr)); // 输出 [1, 2, 3, 4, 5]
  • 初始状态:[3, 1, 4, 2, 5]
  • 第一轮遍历,第一次比较:[1, 3, 4, 2, 5]
  • 第一轮遍历,第二次比较:[1, 3, 4, 2, 5]
  • 第一轮遍历,第三次比较:[1, 3, 2, 4, 5]
  • 第一轮遍历,第四次比较:[1, 3, 2, 4, 5]
  • 第二轮遍历,第一次比较:[1, 2, 3, 4, 5]
  • 第二轮遍历,第二次比较:[1, 2, 3, 4, 5]
  • 第二轮遍历,第三次比较:[1, 2, 3, 4, 5]
  • 第二轮遍历,第四次比较:[1, 2, 3, 4, 5]
  • 第三轮遍历,第一次比较:[1, 2, 3, 4, 5]
  • 第三轮遍历,第二次比较:[1, 2, 3, 4, 5]
  • 第三轮遍历,第三次比较:[1, 2, 3, 4, 5]
  • 第四轮遍历,第一次比较:[1, 2, 3, 4, 5]
  • 第四轮遍历,第二次比较:[1, 2, 3, 4, 5]
  • 第五轮遍历,无需比较,已排序完成。

示例2:从大到小排序

var arr = [3, 1, 4, 2, 5];
function bubbleSortDesc(arr) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    for (var j = 0; j < len - 1 - i; j++) {
      if (arr[j] < arr[j + 1]) {
        var temp = arr[j + 1];
        arr[j + 1] = arr[j];
        arr[j] = temp;
      }
    }
  }
  return arr;
}
console.log(bubbleSortDesc(arr)); // 输出 [5, 4, 3, 2, 1]
  • 初始状态:[3, 1, 4, 2, 5]
  • 第一轮遍历,第一次比较:[3, 4, 1, 2, 5]
  • 第一轮遍历,第二次比较:[3, 4, 2, 1, 5]
  • 第一轮遍历,第三次比较:[3, 4, 2, 1, 5]
  • 第一轮遍历,第四次比较:[3, 4, 2, 1, 5]
  • 第二轮遍历,第一次比较:[3, 2, 4, 1, 5]
  • 第二轮遍历,第二次比较:[3, 2, 4, 1, 5]
  • 第二轮遍历,第三次比较:[3, 4, 2, 1, 5]
  • 第三轮遍历,第一次比较:[2, 3, 4, 1, 5]
  • 第三轮遍历,第二次比较:[3, 2, 4, 1, 5]
  • 第四轮遍历,第一次比较:[2, 3, 1, 4, 5]
  • 第五轮遍历,第一次比较:[2, 1, 3, 4, 5]
  • 第六轮遍历,第一次比较:[1, 2, 3, 4, 5]
  • 第六轮遍历,无需比较,已排序完成。

从两个示例中可以看出,冒泡排序可以根据需求进行升序或者降序排列,但是无论是哪种排序方式,其都具有时间复杂度为O(n^2)的问题,对于大规模的数据进行排序时,效率较低,需要使用其他效率更高的排序算法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS排序之冒泡排序详解 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • Java中集合和数组的排序方式小结

    Java中集合和数组的排序方式小结 数组排序 Java中可以使用Arrays类提供的sort()方法对数组进行排序。sort()方法有两个重载版本: sort(int[] a):对int类型的数组进行升序排序 sort(Object[] a):对实现了Comparable接口的对象数组进行升序排序 示例1:对int类型的数组进行升序排序 int[] arr …

    算法与数据结构 2023年5月19日
    00
  • c#实现最简洁的快速排序(你绝对可以看懂)

    下面我将详细讲解“c#实现最简洁的快速排序(你绝对可以看懂)”的完整攻略。 1、什么是快速排序? 快速排序是一种常用的排序算法,其思想是将一个数组划分为两个子数组,然后分别对这两个子数组进行排序。通过不断地递归调用这个过程,最终得到有序的数组。 2、快速排序的步骤 下面是快速排序的步骤: 选择一个基准值(pivot),一般选择数组中的第一个元素。 定义两个指…

    算法与数据结构 2023年5月19日
    00
  • C#常见算法面试题小结

    C#常见算法面试题小结 常见算法 本文主要讲解C#常见算法,在面试或实际工作中应用较为广泛。以下是本文讨论的常见算法: 排序算法 查找算法 贪心算法 动态规划算法 字符串算法 排序算法 冒泡排序 冒泡排序是一种效率低下的排序,但是学习它有助于了解其他的排序算法。 冒泡排序的核心思想是重复地走访过要排序的序列,每次比较相邻的两个元素,如果他们的顺序错误就把他们…

    算法与数据结构 2023年5月19日
    00
  • C++超详细讲解贪心策略的设计及解决会场安排问题

    C++超详细讲解贪心策略的设计及解决会场安排问题 什么是贪心算法 贪心算法是一种近似算法,通常用于求解最优化问题。在每一步,贪心算法总是做出在当前看来最优的选择,并希望通过这样的选择最终能达到全局最优。 解决会场安排问题的贪心策略 问题描述 为了方便会议的安排,需要一个会议室来容纳所有的会议。现在有n个会议需要在会议室中安排,假设每个会议被安排在一个时间段内…

    算法与数据结构 2023年5月19日
    00
  • PHP大转盘中奖概率算法实例

    下面是一份完整的攻略,讲解如何实现一个PHP大转盘中奖概率算法: 问题描述 如何实现一个PHP大转盘中奖概率算法?也即,在一个转盘上设置几个奖项,每个奖项有对应的中奖概率,随机抽取中奖项并输出对应的奖品。 思路分析 为了实现大转盘的中奖概率算法,需要从以下几个方面入手: 定义奖项:确定奖品数量和对应的中奖概率 生成随机数:使用PHP的rand()函数生成随机…

    算法与数据结构 2023年5月19日
    00
  • JS简单数组排序操作示例【sort方法】

    JS简单数组排序操作示例【sort方法】 操作说明 在JavaScript中,通过数组的sort()方法可以对数组进行排序操作。sort()方法会直接对原数组进行排序,返回排序后的原数组。 sort()方法通常需要传入一个比较函数,来指定排序规则。比较函数接收两个参数,分别表示待比较的两个元素,如果返回值小于0,则表示第一个元素排在第二个元素前面;如果返回值…

    算法与数据结构 2023年5月19日
    00
  • JS实现数组随机排序的三种方法详解

    JS实现数组随机排序的三种方法详解 在JavaScript中,实现数组的随机排序是十分常见的需求。本篇文章将讲解三种实现数组随机排序的方法。 方法一:Fisher-Yates算法 Fisher-Yates算法(也被称为 Knuth算法)是实现数组随机排序最常用的算法之一。该算法的思路很简单,即从数组末尾开始,将当前位置的数与它之前的任意一个数交换顺序,直到数…

    算法与数据结构 2023年5月19日
    00
  • c语言实现冒泡排序、希尔排序等多种算法示例

    当涉及到算法时,实现该算法的语言是一个非常重要的话题。为了帮助初学者理解和重视这一问题,我们提供了“c语言实现冒泡排序、希尔排序等多种算法示例”的完整攻略。 什么是排序算法? 首先,让我们讨论一下排序算法的基本概念。在计算机科学中,排序是一种重要的算法,其目的是将一组数据按照特定的顺序排列。常见的排序算法有冒泡排序、希尔排序、快速排序等。 冒泡排序和希尔排序…

    算法与数据结构 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部