排序练习:冒泡排序

冒泡排序的原理:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

看了上面的原理之后,写了如下代码:

function bubbleSort(arr){
	var tempValue;
	for(var i=0;i<arr.length;i++){
		for(var j=i+1;j<arr.length;j++){
			if (arr[i]>arr[j]) {
				tempValue=arr[i];
				arr[i]=arr[j];
				arr[j]=tempValue;
			}
		}
	}
	return arr;
}

var arry=[3, 7, 4, 9, 1, 10, 8, 6, 5, 2];
console.log(arry);
console.log(bubbleSort(arry));

结果正常:

105819_oAT4_1165991.png

看了一个别的网站,又对代码做了一些改进:

(增加exChange值记录是否交换顺序,当整个数组不再交换顺序的时候,说明已经按顺序排列,终止循环)

function bubbleSort(arr){
	var tempValue;
	for(var i=0;i<arr.length;i++){
		var exChange=false;
		for(var j=i+1;j<arr.length;j++){
			if (arr[i]>arr[j]) {
				tempValue=arr[i];
				arr[i]=arr[j];
				arr[j]=tempValue;
				exChange=true;
			}
		}
		console.log(exChange);
		if(exChange==false){
			break;
		}
	}
	return arr;
}
// var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// var arry=[3, 7, 4, 9, 1, 10, 8, 6, 5, 2];
var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2];
console.log(arry);
console.log(bubbleSort(arry));

114246_yomA_1165991.png

114259_pNhd_1165991.png

这个代码只对顺序的情况才能提高效率:

114311_oiXH_1165991.png

这个代码产生排序错误的情况:

132102_E9Gf_1165991.png

原因可能是别的的代码采用的是自下而上的扫描方式,而我是采用顺序扫描的,因此我修改了代码的扫描顺序:


//这是我的代码
function bubbleSort(arr){
	var tempValue;
	for(var i=0;i<arr.length;i++){
		var exChange=false;
		for(var j=arr.length-1;j>=i;j--){
			console.log(arr[i],arr[j]);
			if (arr[i]>arr[j]) {
				tempValue=arr[i];
				arr[i]=arr[j];
				arr[j]=tempValue;
				exChange=true;
			}
		}
		console.log(exChange);
		if(exChange==false){
			break;
		}
	}
	return arr;
}
// var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arry=[1, 2, 3, 4, 5, 6, 7, 8, 10, 9];
// var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2];
console.log(arry);
console.log(bubbleSort(arry));

然后结果也不对:

134701_WhvU_1165991.png

错误的原因大概是当进行第一次扫描的时候,1和后面所有的值对比都没有发生交换,exChange值存的标识是错误的。

我借鉴的代码如下(代码正确性不得而知,主要是能够提前终止算法可以节约点时间,觉得观点可借鉴):

//这是仿照的代码
void BubbleSort(SeqList R)
   { //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
     int i,j;
     Boolean exchange; //交换标志
     for(i=1;i<n;i++){ //最多做n-1趟排序
       exchange=FALSE; //本趟排序开始前,交换标志应为假
       for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
        if(R[j+1].key<R[j].key){//交换记录
          R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
          R[j+1]=R[j];
          R[j]=R[0];
          exchange=TRUE; //发生了交换,故将交换标志置为真
         }
       if(!exchange) //本趟排序未发生交换,提前终止算法
             return;
     } //endfor(外循环)
    } //BubbleSort

最终,我是没解决这个问题,甚至有点怀疑自己写的是不是冒泡排序算法……

 

2016.09.18

之前代码错误的原因,错把自己思路写出来的排序当成了冒泡排序使用,在借鉴别人设置的扫描标识的时候导致错误(按照1楼的解答重新修改了代码):


//这是我的代码
function bubbleSort(arr){
	var tempValue;
	for(var i=0;i<arr.length;i++){
		var exChange=false;
		for(var j=0;j<arr.length-1;j++){
			console.log(arr[j],arr[j+1]);
			if (arr[j]>arr[j+1]) {
				tempValue=arr[j];
				arr[j]=arr[j+1];
				arr[j+1]=tempValue;
				exChange=true;
			}
		}
		console.log(exChange);
		if(exChange==false){
			break;
		}
	}
	return arr;
}
// var arry=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
var arry=[1, 2, 3, 4, 5, 6, 7, 8, 10, 9];
// var arry=[3, 7, 4, 9, 1, 10, 8, 5, 6, 2];
console.log(arry);
console.log(bubbleSort(arry));

103253_Pi9n_1165991.png

思考:

算法是对前人思路的总结,是一种精炼过的思想,学习算法让我们能够站在大神的高度思考问题。每个人都有自己的思路,这也是一种算法,这种算法也许不是最好的,但我们应努力做到最好。

 

参考:

  1. http://baike.baidu.com/link?url=u_wI7sL7FDcxtl7PyUTIaWvEdHI9q55KibpptLyotBNcvFjKbUbyhssOG-9R_rxs9ydm2_koTNGk2X68ttnnja#3_8【冒泡排序 百度百科】
  2. http://student.zjzk.cn/course_ware/data_structure/web/paixu/paixu8.3.1.1.htm【数据结构 冒泡排序】

转载于:https://my.oschina.net/u/1165991/blog/746711

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值