冒泡排序的原理:javascript
看了上面的原理以后,写了以下代码:java
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));
结果正常:web
看了一个别的网站,又对代码作了一些改进:算法
(增长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));
这个代码只对顺序的状况才能提升效率:数据结构
这个代码产生排序错误的状况:学习
缘由多是别的的代码采用的是自下而上的扫描方式,而我是采用顺序扫描的,所以我修改了代码的扫描顺序:网站
//这是个人代码 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));
而后结果也不对:url
错误的缘由大概是当进行第一次扫描的时候,1和后面全部的值对比都没有发生交换,exChange值存的标识是错误的。code
我借鉴的代码以下(代码正确性不得而知,主要是可以提早终止算法能够节约点时间,以为观点可借鉴):
//这是仿照的代码 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));
思考:
算法是对前人思路的总结,是一种精炼过的思想,学习算法让咱们可以站在大神的高度思考问题。每一个人都有本身的思路,这也是一种算法,这种算法也许不是最好的,但咱们应努力作到最好。
参考: