javascript数组排序算法之冒泡排序

javascript数组排序算法之冒泡排序

  • 冒泡排序
    • 冒泡排序原理
    • 冒泡排序原理图(未优化前)
    • 冒泡排序代码(未优化前)
    • 优化版本动图
    • 优化版本代码
    • 时间复杂度分析
    • 项目链接

冒泡排序

作为一名程序员数组的排序算法是必须要掌握的,今天来说最简单的一种数组排序----冒泡排序

冒泡排序原理

冒泡排序算法是一种简单直观的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

冒泡排序原理图(未优化前)

javascript数组排序算法之冒泡排序_第1张图片

这个是我自己使用生成器写的一个小demo,有些简陋,下面是这个demo的项目地址(vue版)
项目地址:array_sort.
这个项目也可以用原生js + 定时器写,有时间的话我会出一个原生版本,到时候会更新,我为了方便所以用vue写的

冒泡排序代码(未优化前)

const arr = [];
for(let i = 0; i < 10; i ++) {
	arr.push(Math.floor(Math.random() * 100 + 10));
}
console.time('s');
console.log("排序前:",arr);
for(let i = 0; i < arr.length; i ++) {
	for(let j = 0; j < arr.length - i - 1; j ++) {
		if(arr[j] < arr[j+1]) {
			[arr[j],arr[j+1]] = [arr[j+1],arr[j]]; // 使用数组结构进行值的交互
		}
	}
}
console.log("排序后:",arr);
console.timeEnd('s');

输出结果
排序前: (10) [86, 66, 88, 32, 24, 59, 87, 65, 44, 41]
排序后: (10) [88, 87, 86, 66, 65, 59, 44, 41, 32, 24]
s: 0.364990234375 ms

优化版本动图

javascript数组排序算法之冒泡排序_第2张图片

优化版本代码

const arr = [];
let exchange;
for(let i = 0; i < 10; i ++) {
	arr.push(Math.floor(Math.random() * 100 + 10));
}
console.time('s');
console.log("排序前:",arr);
for(let i = 0; i < arr.length; i ++) {
	exchange = false;
	for(let j = 0; j < arr.length - i - 1; j ++) {
	  if(arr[j] < arr[j+1]) {
	    [arr[j],arr[j+1]] = [arr[j+1],arr[j]]; // 使用数组结构进行值的交互
            exchange = true;
	  }
	}
	if(!exchange) {
		break;
	}
}

console.log("排序后:",arr);
console.timeEnd('s');

上述代码输出结果
排序前: (10) [65, 69, 64, 95, 100, 92, 16, 81, 96, 87]
排序后: (10) [100, 96, 95, 92, 87, 81, 69, 65, 64, 16]
s: 0.328125 ms

优化版本快0.04左右,十条数据排序0.04ms,不过大量的数据排序,应该也不会让前端处理

当后面的数字已经排序的情况下,就直接跳出循环,减少循环次数,同时优化j+1,让每次循环不用进行运算j+1的值

时间复杂度分析

最好情况 空间复杂度 最差情况
O(n) O(1) O(n^2)
已经排好序的数组 因为要一个临时空间 完全无序,需要遍历每一个元素

项目链接

项目链接:array_sort.

你可能感兴趣的:(算法专区,javascript)