冒泡排序问题???

for(var r=1;r<my_data.length;r++){
               for(var i=0;i<my_data.length-r;i++){
                  if(my_data[i+1]!=undefined){
                    if(my_data[i].b_val>my_data[i+1].b_val){
                        my_data[i]=[my_data[i+1],my_data[i+1]=my_data[i]][0];
                    }                  
                  }
              }
          }

问一下这样写冒泡有什么错?![图片描述
根据数组里对象的属性(b_val)排序 为什么会这样?
图片描述

阅读 2k
1 个回答

关键在于:js对象是按引用传递的。

// 原因分析:
// 此时,my_data[i+1] = my_data[i]改变了my_data[i+1]的引用;
// 然后,[my_data[i+1],my_data[i+1]=my_data[i]][0]取到的对象,是my_data[i]
my_data[i]=[my_data[i+1],my_data[i+1]=my_data[i]][0]

// 改进:使用一个中间变量
var tmp = my_data[i];
my_data[i] = my_data[i+1];
my_data[i+1] = tmp;

拍出可行版本冒泡排序:做了一点点优化。

function bubble( my_data ) {
  var length = my_data.length;
  var flag;
  for (var r = 0; r < length-1; r++) {  // r表示进行了多少趟
    flag = true;  // flag表示当前趟是否冒泡,true代表没有冒泡,当一趟排序后,没有冒泡就代表排好序了,就停止冒泡,立刻返回排序后的数组。
    for (var i = 0; i < length - r; i++) {
      if ( my_data[i].b_val > my_data[i+1].b_val ) {
        var tmp = my_data[i];
        my_data[i] = my_data[i+1];
        my_data[i+1] = tmp;
        flag = false;
        console.log(my_data);
      };
    };
    if ( flag ) {
      return my_data;
    };
  };
  return my_data;
};
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题