笔记整理自 coderwhy 『TypeScript 高阶数据结构与算法』课程
概念
本质:相邻元素两两比较并交换位置,使整个序列按照特定的顺序排列
特性
复杂度分析
- 时间复杂度:
- 最好情况:O(
n
) - 最坏情况:O(
n^2
) - 平均情况:O(
n^2
)
- 最好情况:O(
- 空间复杂度: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));
}
标签:arr,TypeScript,newArr,冒泡排序,算法,数据结构,let,遍历,排序
From: https://www.cnblogs.com/itchaox/p/18123593