一篇文章搞定javascript氣泡排序

陌上寒發表於2018-12-18

從今天開始講述關於javascript的排序

氣泡排序

氣泡排序是最慢的排序演算法之一,但也是最容易實現的排序演算法。 之所以叫氣泡排序是因為這種演算法在排序時,資料值會像氣泡一樣從陣列的一端漂浮到另一端,假設正在將一組數字按照升序排列,較大的值會浮動到陣列的右側,較小的值會浮動到陣列的左側,之所以會產生這種現象是因為演算法會多次在陣列中移動,比較相鄰的資料,當左側的值大於右側的值時,將他們進行互換。

一個簡單的?: E A D B H 經過第一次排序後: A E D B H 第一個和第二個元素進行了互換

經過第二次排序: A D E B H 第二個和第三個進行了互換

經過第三次排序: A D B E H 第三個和第四個進行了互換

最後,第二個和第三個再次進行互換,得到最終順序: A B D E H 一張圖片描述的很形象

一篇文章搞定javascript氣泡排序

準備工作,造資料

我們先準備一組隨機資料,用來排序使用 要求:

  • 陣列
  • 整數(0-100)
let arr = []

function arrData(num) {
	for (let i = 0; i < num; i++) {
		arr[i] = Math.floor(Math.random() * num + 1)
	}
}
arrData(100)
console.log(arr);
複製程式碼

一篇文章搞定javascript氣泡排序

利用sort氣泡排序

arr = arr.sort(function (a, b) {
	return a - b
});
console.log(arr); 
複製程式碼

一篇文章搞定javascript氣泡排序

通過新增中間變數實現氣泡排序

function sortarr(myArr) {
	for (let i = 0; i < myArr.length - 1; i++) {
		for (let j = 0; j < myArr.length - 1; j++) {
			if (myArr[j] > myArr[j + 1]) {
				let temp = myArr[j];
				myArr[j] = arr[j + 1];
				myArr[j + 1] = temp;
			}
		}
	}
	return myArr;
}
let arr1 =   sortarr(arr)
console.log(arr1);
複製程式碼

輸出結果是一樣的

不通過新增中間變數實現氣泡排序

不使用中間變數,演算法原型如下:(不使用第三個變數,互換兩個元素)

a = 10; //第一個元素
b = 5; //下一個元素
if (a > b) {
	a = a + b; // a(15) = 10 +5;
	b = a - b; // b(10) = 15 - 5;
	a = a - b; // a(5) = 15 - 10;
}
複製程式碼

氣泡排序如下:

function jssort(myArr) {
	for (let i = 0; i < myArr.length-1; i++) { //要迴圈多少次
		for (let j = 0; j < myArr.length  - 1; j++) { //要移動幾次
			if (myArr[j] > myArr[j + 1]) {
				myArr[j] = myArr[j] + myArr[j + 1]; //a = a+b 
				myArr[j + 1] = myArr[j] - myArr[j + 1]; //b = a-b
				myArr[j] = myArr[j] - myArr[j + 1]; //a = a-b
			}
		}
	}
	return myArr;
}
複製程式碼

通過es6,可以實現同樣的效果 演算法原型:

let arr1 = [1,3]
[1,3]=[3,1]
console.log(arr1);//=> [3, 1]
複製程式碼

排序

function jssort(myArr) {
	for (let i = 0; i < myArr.length-1; i++) { //要迴圈多少次
		for (let j = 0; j < myArr.length  - 1; j++) { //要移動幾次
			if (myArr[j] > myArr[j + 1]) {
				[myArr[j] , myArr[j + 1]]=[myArr[j+1] , myArr[j]]
			}
		}
	}
	return myArr;
}
複製程式碼

氣泡排序的一次優化

我們之前的陣列的長度是100,不利於觀察,我們宣告一個簡單一點的陣列

var arr = [65, 39, 28, 11, 10, 3];
function jssort(myArr) {
	for (let i = 0; i < myArr.length - 1; i++) { //要迴圈多少次
		console.log(`第${i}次`);
		for (let j = 0; j < myArr.length - 1; j++) { //要移動幾次
			if (myArr[j] > myArr[j + 1]) {
				[myArr[j], myArr[j + 1]] = [myArr[j + 1], myArr[j]]
			}
			console.log(arr);
		}
	}
	return myArr;
}
console.log(jssort(arr));
複製程式碼

看下輸出:

一篇文章搞定javascript氣泡排序
兩層for迴圈,當i=0的時候,裡面的迴圈完整執行,從j=0執行到j=5,這也就是第一遍排序,結果是將最大的數排到了最後

當i=1的時候,裡面的迴圈再次完整執行,由於最大的數已經在最後了,沒有必要去比較陣列的最後兩項,所以可以做一下優化:

var arr = [65, 39, 28, 11, 10, 3];
function jssort(myArr) {
	for (let i = 0; i < myArr.length - 1; i++) { //要迴圈多少次
		console.log(`第${i}次`);
		for (let j = 0; j < myArr.length - 1 - i; j++) { //要移動幾次
			if (myArr[j] > myArr[j + 1]) {
				[myArr[j], myArr[j + 1]] = [myArr[j + 1], myArr[j]]
			}
			console.log(arr);
		}
	}
	return myArr;
}
console.log(jssort(arr));
複製程式碼

一篇文章搞定javascript氣泡排序
第一次執行,找到最大的,並放在陣列的左端 第二次執行,找到了第二大的,放在了做起第二的位置, 所以,內層迴圈可以做如下優化,當資料量很大的時候,顯得尤為重要

for (let j = 0; j < myArr.length - 1 - i; j++) {
	//....
}
複製程式碼

好了,關於javascript氣泡排序就講到這裡了,明天我們繼續討論js排序的其他演算法

原文連結

一篇文章搞定javascript氣泡排序

相關文章