大家好,又见面了,我是你们的朋友全栈君。
数组的冒泡排序算法也算一道经典面试题了,这里也给大家分享一下JavaScript中关于数组的冒泡排序的写法和思路,这里将代码封装成了函数需要的朋友可以直接赋值使用,代码中具有详细的注释:
先给大家上代码:
<script>
//sort函数需要接收两个值:第一个是需要排序的数组,第二个是排序的方式(从小到大/从大到小)
function sort (arr,num) {
for (var i = 0; i < arr.length -1; i++) { // 外层循环管趟数,即数组的全部项数都排好一共需要比较多少次一趟排好一个,注意趟数应该是数组长度-1
for (var j = 0; j < arr.length - i - 1; j++) { // 里面的循环控制每一趟需要比较的次数,注意:这个次数应该是越来越少的,因为每循环一趟数组中都会有一个数被确定下来,那么就只需要再比较剩下没有被确定的即可
if (num == 0) { // num == 0 则排序方式为从小到大
// 内部的if判断相邻两个元素的值是否需要交换
if (arr[j] > arr[j + 1]) { // 如果前一个 > 后一个则交换
var temp = arr[j]; // 交换两个变量的值,需要引入一个临时变量协助一下
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
} else { // num != 0 则排序方式为从大到小
// 内部的if判断相邻两个元素的值是否需要交换
if (arr[j] < arr[j + 1]) { // 如果前一个 < 后一个则交换
var temp = arr[j]; // 交换两个变量的值,需要引入一个临时变量协助一下
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
return arr;
}
// 需要传两个参数,第一个是需要排序的数组,第二个数值=0则从小到大排序,!=0则从大到小排
var one = [2, 4, 5, 1, 3]; // 需要排序的数组
var tow = 0; // 决定排序方式:0表示从小到大,非0表示从大到小
var re = sort(one, tow); //调用函数、传入参数
console.log(re); // 打印结果:[1, 2, 3, 4, 5]
</script>
冒泡排序:就是将数组中每相邻的两个项数进行比较按照一定的顺序(从大到小/从小到大)进行排序,一轮排好一个数,经过有限轮次的比较后即可按需求排好数组的项数。
排序主要思路:以上代码为例:代码中的arr = [2, 4, 5, 1, 3];如果是按照从小到大排序,先将2和4进行比较,大的在后,所以不需要换位置,然后4和5比较也一样不需要换位置,然后5和1比较发现是大的在前就不符合规则所以更换5和1的位置,在然后5和3比较也同样不符合规则所以更换位置,所以第一轮排序后数组变成了[2, 4, 1, 3, 5],从小到大的顺序此时一轮下来已有一个数字找到了自己正确的位置,然后看似还有四个数都不在它们正确的位置上,但是其实只需要再有3个数能正确找到它们自己的位置就可以了,因为总共5个数4个数都在正确的位置上了那剩下的一个肯定就是在属于它的位置上咯。所以外层循环的次数需要的是数组的长度减1次;而内层的循环次数其实是一直在减少的,比如经过了第一轮循环后数组变成[2, 4, 1, 3, 5],那么内层再比较只需要比较到3的位置即可,即2和4比、4和1比、4和3比,数组变成[2, 1, 3, 4, 5],所以其实将4放到正确的位置只比较了3次而已,而将5放到正确的位置使用了4次,所以内层比较的次数是在依次减少的而且是每次循环后需比较次数减1,所以外层循环越多,内层所需比较的次数就越少。
冒泡排序是一道经典算法题,其实要实现排序效果并不难,难在我们需要尽量减少优化程序中那些没有存在必要的执行路径,老师说“算法都是知难行易”,我们每一刻复杂的纠结都是在为了较少代码的执行冗余,这是程序员的责任和目标,不断的优化自己的代码,减少错误、无用的执行,才能让我们的项目更加优秀、出彩。
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/144993.html原文链接:https://javaforall.cn