为了账号安全,请及时绑定邮箱和手机立即绑定

js 冒泡排序

js 冒泡排序

undertale 2017-03-23 14:19:14
第一个写法写了2个for ,不太好理解,请大家帮我解释一下,第二个写的对吗?还有一些小的疑问,图片上标注了。
查看完整描述

3 回答

已采纳
?
zzylove

TA贡献9条经验 获得超1个赞

第一重循环(第一个for)是为了找到第i小的数,比如当i=0时,找的是第一小的数,放在数组最前面,当i=1时,找除了arr[0]的最小的数也就是第二小的数,以此类推。第二重循环(第二个for)是为了遍历数组-i个数,依次和他们比,比谁更小,最小的放到i这个位置。
第二个

 我改了一下,可以这么写“var len = arr.length,j,temp;”这个是冒泡排序,每次最外面的循环一次,就会把数组中最大数排到最后

  function bubbleSort(arr){
    var len = arr.length,j,temp;
    var i=len;
    while(i>0){
        for( j = 0; j < len - 1;j++){

            if(arr[j] > arr[j+1]){

                temp = arr[j];

                arr[j] = arr[j+1];

                arr[j+1] = temp;
            }
        }
    i--;
    }

    return arr;

}
查看完整回答
反对 回复 2017-03-23
  • undertale
    undertale
    我贴的第一个代码不是冒泡排序吗?楼上说是选择排序?
  • zzylove
    zzylove
    不是冒泡排序,确实是选择。经典的冒泡排序就是相邻俩个数交换,你贴的一个代码,不是相邻的两个数进行交换,而是每次都会和别的数比较,从中选出最小的。冒泡排序,就和字面的意思,泡泡慢慢的冒上去,通过相邻的两个数交换,慢慢的把最大的数顶上去。比如1,5,2,4,3,。它的变化是1,5,2,4,3->1,2,5,4,3->1,2,4,5,3->1,2,4,3,5->1,2,3,4,5。但是如果是一个方法,它的变化是这样1,5,2,4,3->1,2,5,4,3->1,2,4,5,3->1,2,3,5,4->1,2,3,4,5 在第3次的变化中就可以发现是有区别的,选择排序每一次从待排序的数中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数排完。
  • undertale
    undertale
    第一个变化顺序应该是15243-12543-12345吧?12543以后不是应该5和3交换位置了吗?
点击展开后面9
?
西兰花伟大炮

TA贡献376条经验 获得超318个赞

注意,你这个不是冒泡排序,是选择排序哦,第一个for的i = 0是数组的第1个元素,而第二个for是用来表示从比i大1的位置开始循环。来把剩下的元素与i进行比较,当找到就进行交换,循环结束就让i加一,然后j仍然比i大一,第二个那里不是i,是len--;

<script>
            function bubbleSort(arr){
                var len = arr.length,j;
                while(len>0){
                    for (var j = 0;j < len - 1;j++) {
                        if(arr[j] > arr[j+1]){
                            var temp = arr[j];
                            arr[j] = arr[j+1];
                            arr[j+1] = temp;
                        }
                    }
                    len--;
                }
                return arr;
            }
            arr1 = [4,6,1,5,8,7,9,2];
            console.log(bubbleSort(arr1))
<script>
   function bubbleSort(arr){
       var len = arr.length;
       for(var i = 0; i < len;i++ ){
           for(var j = 0; j < len - i - 1;j++){
               if(arr[j] > arr[j+1]){
                   var temp = arr[j];
                   arr[j] = arr[j+1];
                   arr[j+1] = temp;
               }
           }
       }
       return arr;
   }
    var array = [10,9,8,7,6,5,4,3,2,1];
    console.log(bubbleSort(array));/*每一次外层循环把当前数列中最大值排到最后,
    并减少数组长度,就不再遍历最后的最大,每内层循环一遍就会找出一个当前数列最大的值*/

这才是冒泡排序

查看完整回答
2 反对 回复 2017-03-23
  • 西兰花伟大炮
    西兰花伟大炮
    因为每次循环都会找出一个最大的数,也就是j循环里会减一个,也就是长度会减1,下一次就不再循环那个最大的数了
?
qq_聆爱依魂_0

TA贡献5条经验 获得超2个赞

二次因为你每次从数组中取一个数(一次FOR,遍历全数组-1各数),和数组中剩下的数比(二次FOR,遍历全数组减去第一个FOR中已经比较过的数)。 第二个有错,别看了

查看完整回答
反对 回复 2017-03-23
  • undertale
    undertale
    请问第二个哪里错了,我再博客园看到的。我自己看不出来
  • 3 回答
  • 0 关注
  • 1979 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信