排序練習:冒泡排序

冒泡排序的原理:javascript

  1. 比較相鄰的元素。若是第一個比第二個大,就交換他們兩個。
  2. 對每一對相鄰元素做一樣的工做,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
  3. 針對全部的元素重複以上的步驟,除了最後一個。
  4. 持續每次對愈來愈少的元素重複上面的步驟,直到沒有任何一對數字須要比較。

看了上面的原理以後,寫了以下代碼: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));

思考:

算法是對前人思路的總結,是一種精煉過的思想,學習算法讓咱們可以站在大神的高度思考問題。每一個人都有本身的思路,這也是一種算法,這種算法也許不是最好的,但咱們應努力作到最好。

 

參考:

  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【數據結構 冒泡排序】
相關文章
相關標籤/搜索