對數組進行 冒泡排序 算是比較簡單的,冒泡排序也是容易理解的一種排序算法了,在面試的時候,極可能就會問到。前端
數組中有n
個數,比較每相鄰兩個數,若是前者大於後者,就把兩個數交換位置;這樣一來,第一輪就能夠選出一個最大的數放在最後面;那麼通過n-1
(數組的 length - 1) 輪,就完成了全部數的排序。
好的,咱們先來實現找數組中的最大數,並把他放到數組最後。面試
var arr = [3,4,1,2]; // 遍歷數組,次數就是arr.length - 1 for (var i = 0; i < arr.length - 1; i++) { // 若是前一個數 大於 後一個數 就交換兩數位置 if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } console.log(arr) // [3, 1, 2, 4]
咱們能找到數組中最大的數,放到最後,這樣重複 arr.length - 1
次,即可以實現數組按從小到大的順序排好了。算法
var arr = [3,4,1,2]; // 遍歷數組,次數就是arr.length - 1 for (var j = 0; j < arr.length - 1; j++) { // 這裏 i < arr.length - 1 ,要思考思考合適嗎?咱們下面繼續說 for (var i = 0; i < arr.length - 1; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } console.log(arr) // [1,2,3,4]
雖然上面的代碼已經實現冒泡排序了,但就像註釋中提到的,內層 for 循環的次數寫成,i < arr.length - 1
,是否是合適呢?
咱們想一下,當第一次,找到最大數,放到最後,那麼下一次,遍歷的時候,是否是就不能把最後一個數算上了呢?由於他就是最大的了,不會出現,前一個數比後一個數大,要交換位置的狀況,因此內層 for 循環的次數,改爲 i < arr.length - 1 -j
,才合適,看下面的代碼。segmentfault
var arr = [3, 4, 1, 2]; function bubbleSort (arr) { for (var j = 0; j < arr.length - 1; j++) { // 這裏要根據外層for循環的 j,逐漸減小內層 for循環的次數 for (var i = 0; i < arr.length - 1 - j; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; } } } return arr; } bubbleSort(arr);
咱們想下這個狀況,當原數組是,arr = [1,2,4,3];
在通過第一輪冒泡排序以後,數組就變成了arr = [1,2,3,4];
此時,數組已經排序完成了,可是按上面的代碼來看,數組還會繼續排序,因此咱們加一個標誌位,若是某次循環完後,沒有任何兩數進行交換,就將標誌位 設置爲 true,表示排序完成,這樣咱們就能夠減小沒必要要的排序,提升性能。數組
var arr = [3, 4, 1, 2]; function bubbleSort (arr) { var max = arr.length - 1; for (var j = 0; j < max; j++) { // 聲明一個變量,做爲標誌位 var done = true; for (var i = 0; i < max - j; i++) { if (arr[i] > arr[i + 1]) { var temp = arr[i]; arr[i] = arr[i + 1]; arr[i + 1] = temp; done = false; } } if (done) { break; } } return arr; } bubbleSort(arr);
時間複雜度: 平均時間複雜度O(n*n) 、最好狀況O(n)、最差狀況O(n*n)
空間複雜度: O(1)
穩定性:穩定性能
時間複雜度指的是一個算法執行所耗費的時間
空間複雜度指運行完一個程序所需內存的大小
穩定指,若是a=b,a在b的前面,排序後a仍然在b的前面
不穩定指,若是a=b,a在b的前面,排序後可能會交換位置spa
一、外層 for 循環控制循環次數
二、內層 for 循環進行兩數交換,找每次的最大數,排到最後
三、設置一個標誌位,減小沒必要要的循環code
好的,下一篇文章,來實現下冒泡排序的可視化,把冒泡排序的過程展現出來。
JavaScript實現冒泡排序 可視化blog