它是最慢的排序演算法之一。
1、不斷比較相鄰的兩個元素,如果前乙個比後乙個大,則交換位置。
2、當比較完第一輪的時候最後乙個元素應該是最大的乙個。
3、按照步驟一的方法進行相鄰兩個元素的比較,這個時候由於最後乙個元素已經是最大的了,所以第二輪的時候最後乙個元素不用比較,此後依次類推。
氣泡排序**演示:
}另一種寫法可能更好理解:每一次比較後都拿最小的那個元素放到前面
for (let i = 0; i < ns.length - 1; i++) }}從陣列的開頭開始,將第乙個元素和其他元素進行比較,比較完所有元素後,將最小的元素與第乙個元素交換,然後演算法會從第二個元素繼續,依次類推。當進行到陣列的倒數第二個位置時,所有的資料便完成了排序。
選擇排序**演示:
}從第二個元素開始迴圈,當前面的元素比選中的元素大時將前面的元素向右移動,直至比較到第1個元素(即索引為0)或者前面的元素不再比選中的大,此時將選中的元素賦值給比它小的元素之後的位置。
插入排序**演示:
將選中的元素賦值給比它小的元素之後的位置
}
return
arr;
}以上的三種基本排序演算法中,選擇排序和插入排序要比氣泡排序快,插入排序是這三種演算法中最快的
高階排序演算法被認為是處理大型資料集的最高效排序演算法,它們處理的資料集可以達到上百萬個元素。
這在插入排序的基礎上做了很大的改善。它會首先比較距離較遠的元素,而非相鄰的元素。比較的元素之間的距離會不斷減小,直至比較的是相鄰元素,此時就是乙個直接的插入排序。在開始做最後一次處理時,大部分元素都已經在正確的位置,演算法就不必對很多元素進行交換,這就是希爾排序比插入排序更高效的地方。
比如:陣列為 [49,38,65,97,26,13,27,49,55,4],當間隔為5時,將分組為五組資料(49,13)、(38,27)、(65,49)、(97,55)、(26,4),分別對五組資料進行直接的插入排序,然後此時的陣列會變為 [13,27,49,55,4,49,38,65,97,26],依次類推直至間隔為1
通過定義乙個間隔序列來表示在排序過程中進行比較的元素之間有多遠的間隔。下面的演算法時是動態定義間隔序列。
function歸併排序的實現有兩種方法:1、自上而下(自頂向下)的遞迴 。2、自下而上(自底向上)的迭代shellsort(arr)
for (gap; gap > 0; gap = math.floor(gap / 3))
arr[j + gap] = current; //
將選中的元素賦值給比它小的元素之後的位置
} }
return
arr;
}
將資料集分解為多組分別只有乙個元素的陣列,然後通過建立一組左右子陣列將它們兩兩有序地合併起來,直到最後合併剩下的兩個大的陣列組成有序的完整陣列。
歸併排序**演示:
}是處理大資料最快的排序演算法之一,快速排序演算法非常適用於大型資料集合;在處理小資料集時效能反而會下降。
(1) 選擇乙個基準元素,將列表分隔成兩個子串行,將所有小於基準值的元素放在基準值的前面,所有大於基準值的元素放在基準值的後面; (2) 分別對較小元素的子串行和較大元素的子串行重複步驟 1
快速排序**演示:
qsort(left).concat(pivot, qsort(right)); //小的元素都放在了基準值的左邊,大的都放在了右邊。小的和大的分別進行了遞迴,結果也是如此,所以完成了排序。
插入排序、氣泡排序和選擇排序的時間複雜度為 o(n2)
插入排序、希爾排序、氣泡排序、選擇排序和堆排序的空間複雜度為 o(1),歸併排序的空間複雜度為 o(n)
JS之排序演算法
在平時的工作中呢也用不到太多的演算法,但是私認為演算法還是挺鍛鍊乙個程式設計師的邏輯思維的,寫一下會的幾種演算法吧 氣泡排序 function bubblesort arr console.log arr return arr var num 1,2,1,3,7,4,9,0 console.log ...
JS排序演算法之希爾演算法
希爾演算法 希爾演算法在原理上也是一種插入排序,在了解希爾演算法之前,必須了解插入排序 原理 希爾排序在插入排序的基礎上,將資料進行了分組,將原有的資料分為若干個子集,然後對每個子集進行排序,依次類推,不停地分割成子集,直到最後完全排序。數列 3,5,2,4,7,6,8,9,1 先將整個數列以gap...
JS排序演算法之快速排序
快速排序和歸併排序都是採用二分法的排序演算法。都是 olog n 不過快速排序更複雜一些。快遞排序跟歸併排序的區別是順序,它是先總後分。不斷地從斷點分,讓左邊的數都小於斷點,右邊都大於斷點。然後迭代切分。1 var group 1,9,3,5,0,4,2,8 23 function swap k,y...