從今天開始講述關於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 一張圖片描述的很形象
準備工作,造資料
我們先準備一組隨機資料,用來排序使用 要求:
- 陣列
- 整數(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);
複製程式碼
利用sort氣泡排序
arr = arr.sort(function (a, b) {
return a - b
});
console.log(arr);
複製程式碼
通過新增中間變數實現氣泡排序
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));
複製程式碼
兩層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));
複製程式碼
第一次執行,找到最大的,並放在陣列的左端
第二次執行,找到了第二大的,放在了做起第二的位置,
所以,內層迴圈可以做如下優化,當資料量很大的時候,顯得尤為重要
for (let j = 0; j < myArr.length - 1 - i; j++) {
//....
}
複製程式碼
好了,關於javascript氣泡排序就講到這裡了,明天我們繼續討論js排序的其他演算法