冒泡排序的基本实现【数据结构与算法—TypeScript 实现】

笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程

概念

本质:相邻元素两两比较并交换位置,使整个序列按照特定的顺序排列

特性

复杂度分析

  • 时间复杂度:
    • 最好情况:O(n)
    • 最坏情况:O(n^2)
    • 平均情况:O(n^2)
  • 空间复杂度:O(1),原地排序

使用场景

因为时间复杂度为 O(n^2)

  • 适用于数据规模较小的时候
  • 不适用于大规模数据的排序

具体代码

算法代码


// 可以直接导入下方提供的算法测试工具函数,函数内部提供模拟数据,非常方便的测试算法
import { testSort } from './utils';

/**
 - @desc  : 冒泡排序实现
 */
function bubbleSort(arr: number[]): number[] {
  const n = arr.length;

  // 外层遍历,数组内一共有多少个数据需要遍历
  for (let i = 0; i < n; i++) {
    // 是否交换
    let swapped = false;

    // 内层遍历,数组中每个元素分别需要遍历多少次,当一个到达尾部后,下一个遍历次数需 - 1
    for (let j = 0; j < n - 1 - i; j++) {
      //  按升序排序
      if (arr[j] > arr[j + 1]) {
        // 交换位置
        [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        swapped = true;
      }
    }

    // 此轮一直未交换,则数据已排序,不需再执行后续遍历
    if (!swapped) break;
  }

  return arr;
}

// 此处可以直接使用 utils 提供的测试函数进行算法测试
testSort(bubbleSort);

// 算法测试
let arr = [10, 90, 20, 100, 50];
console.log('排序前:', arr); // [10, 90, 20, 100, 50]

let newArr = bubbleSort(arr);
console.log('排序后:', newArr); // [10, 20, 50, 90, 100]

util 工具函数



/**
 - @desc  : 判断排序是升序
 - @param  {number} arr:数组
 - @return {any} 是否升序
 */
function isSort(arr: number[]): boolean {
  for (let i = 0; i < arr.length; i++) {
    // 只有有一个不是升序,则返回 false
    if (arr[i] > arr[i + 1]) {
      return false;
    }
  }

  return true;
}

/**
 - @desc  : 测试排序的功能
 - @param  {any} sortFn:排序函数
 */
export function testSort(sortFn: Function) {
  // 构造随机测试的假数据
  let arr = new Array(10);
  const n = arr.length;

  for (let i = 0; i < n; i++) {
    arr[i] = Math.floor(Math.random() * 500);
  }

  console.log('排序前:', arr);

  let newArr = sortFn(arr);
  console.log('排序后:', newArr);

  console.log('排序是否成功?', isSort(newArr));
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值