JavaScript数组-冒泡排序

JavaScript数组-冒泡排序数组的冒泡排序算法也算一道经典面试题了,这里也给大家分享一下JavaScript中关于数组的冒泡排序的写法和思路:先给大家上代码:<script>//冒泡排序:将数组中的数字按照从大到小或从小到大的顺序排序vararr=[2,4,5,1,3];for(vari=0;i<arr.length-1;i++){//外层循环管趟数,即数组的全部项数都排好一共需要比较多少次一趟排好一个,注意趟

大家好,又见面了,我是你们的朋友全栈君。

数组的冒泡排序算法也算一道经典面试题了,这里也给大家分享一下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.net/144993.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • TDD与FDD技术对比

    TDD与FDD技术对比双工(Duplex)是一种在单一通信信道上实现双向通信的过程,包括两种类型,分别为半双工和全双工。  在半双工系统中,通信双方使用单一的共享信道轮流发送数据。双向广播就采用了这种方式。在一方发送数据时,另一方只能收听。数据发送方通常会发出“Over”的信号,表明本方数据发送结束,对方可以开始发送数据。在实际网络中,两台计算机可以使用一根通信电缆来轮流收发数据。  全双工则是指同时的双向通信

    2022年6月6日
  • 补码加法运算溢出判断例题_补码加法溢出

    补码加法运算溢出判断例题_补码加法溢出补码加法运算溢出判断三种方法:[方法一]Xf、Yf分别两个数符号位,Zf为运算结果符号位。当Xf=Yf=0(两数同为正),而Zf=1(结果为负)时,负溢出;当出现Xf=Yf=1(两数同为负),而Zf=0(结果为正),正溢出.[方法二]Cs表示符号位的进位,Cp表示最高数值位进位,⊕表示异或。若Cs⊕Cp=0,无溢出;若Cs⊕Cp=1,有溢出。[方法三]用变形

    2022年9月22日
  • 什么是面向对象?「建议收藏」

    什么是面向对象?「建议收藏」面向对象是一种思想,是相对于面向过程而言的。面向对象是将功能等通过对象实现,将功能封装进对象中,让对象去实现具体细节。面向对象的三大特征:封装性、继承性、多态性。封装性就是把对象的属性和实现的细节隐藏

    2022年7月2日
  • navicat15.0.17万能激活码【在线注册码/序列号/破解码】

    navicat15.0.17万能激活码【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月19日
  • JavaScript如何判断是否为数字?

    JavaScript如何判断是否为数字?JavaScript如何判断是否为数字?方法1:使用isNaN()函数isNaN()函数是js自带的全局函数,isNaN()函数用于检查其参数是否是非数字值。如果值x是特殊的非数字值NaN(或者能被转换为这样的值),返回的值就是true;如果值x是其他值,则返回false。isNaN()的缺点就在于null、空格以及空串会被按照0来处理NaN:NotaNumber<script>document.write(isNaN(123));//数字-

    2022年6月29日
  • Android使用ViewPager实现左右循环滑动及轮播效果

    边界的时候会看到一个不能翻页的动画,可能影响用户体验。此外,某些区域性的ViewPager(例如展示广告或者公告之类的ViewPager),可能需要自动轮播的效果,即用户在不用滑动的情况下就能够看到其

    2021年12月27日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号