排序算法优劣说明:
稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;
不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
内排序:所有排序操作都在内存中完成;
外排序:由于数据太大,因此把数据放在磁盘中,而排序通过磁盘和内存的数据传输才能进行;
事件复杂度:一个算法执行所耗费的事件;
空间复杂度:运行完一个程序所需内存的大小;
排序算法图片总结:
图片引用自 : js十大排序算法
冒泡排序原理:
依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面,依照这个规则进行多次并且递减的迭代,直到排序顺序正确为止。
举例说明:
现在有一个数组为[2,5,3,1,4]
①排序开始,对比第一项和第二项,由于顺序是正确的,无需交换;
②对比第二项和第三项,由于5大于3,所以交换位置,3排到前面,结果是[2,3,5,1,4];
③对比第三项和第四项,由于5大于1,所以交换位置,1排到5前面,结果是[2,3,1,5,4];
④再次循环第二项和第三项,3大于1,交换位置,结果是[2,1,3,5,4];
⑤第一项和第二项交换,为[1,2,3,5,4],第四项和第五项交换为[1,2,3,4,5]。
冒泡排序:
冒泡排序的第一步其实就是写一个方法,用于交换数组里面需要交换位置的两个元素:
function exchangeNum (items, frontIndex, behindIndex) { var temp = items[frontIndex] items[frontIndex] = items[behindIndex] items[behindIndex] = temp }
正向冒泡排序:
let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18] // 外层循环控制的是循环遍历的次数,内层循环是遍历数组 // 因为需要两两比较大小,所以5个元素只需比较4次,arr.length个元素则比较arr.length-1次 for (let i = 0; i < arr.length - 1; i++) { for (let j = 0; j < arr.length - 1 - i; j++) { // 比较相邻的两个元素,如果前一个比后一个大,则交换位置 if (arr[j] > arr[j + 1]) { exchangeNum(arr, j, j + 1) } } } console.log(arr) // 输出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]
反向冒泡排序:
let arr = [89, 99, 10, 3, 15, 1, 45, 78, 32, 9, 18] for (let i = arr.length - 1; i >= 0; i--) { for (let j = arr.length - i - 1; j >= 0; j--) { if (arr[j] < arr[j - 1]) { exchangeNum(arr, j, j - 1) } } } console.log(arr) // 输出:[1, 3, 9, 10, 15, 18, 32, 45, 78, 89, 99]
js的冒泡排序算法可能在实际工作中并没有什么应用,实际工作中用的最多的是Array.prototype.sort(),因为相较于冒泡排序,他拥有更高的效率。但是面试的时候问冒泡排序原理的很多,可能他更像一个工具,可以帮我们更好的了解算法。