Javascript常見排序演算法的筆記
排序演算法主要針對的是陣列,所以,在開始學習之前,我們先自己新建一種資料結構來方便我們的學習。
function ArrayData () {
let ret = []
this.times = 0 // 統計執行次數
this.push = (item) => {
ret.push(item)
}
this.toString = () => {
return ret.join()
}
}
const arr = [34, 11, 45, 22, 31, 99, 68, 54]
氣泡排序 比較相鄰兩個數的大小,如果前面的數大於後面,則交換這兩個數的位置。要排序n個數字,需要經歷n-1次的遍歷。
按照字面要求,我們寫出來的程式碼是這樣的
function ArrayData () {
// ......
this.bubbleSort = function () {
let length = ret.length;
for (let i = 0; i ret[j + 1]) {
[ret[j], ret[j + 1]] = [ret[j + 1], ret[j]]
}
}
}
}
}
let tmp = new ArrayData()
arr.forEach((item) => {
tmp.push(item)
})
tmp.bubbleSort()
console.log(tmp.times) // 56
顯然這種簡單粗暴的排序方式有很大的提升空間,比如,我們可以檢測每次排序,如果順序已經排列成功,就沒必要執行之後的迴圈了。
function ArrayData () {
// ......
this.bubbleSort = function () {
let length = ret.length;
for (let i = 0; i ret[j + 1]) {
[ret[j], ret[j + 1]] = [ret[j + 1], ret[j]]
change = true
}
}
if (!change) {
break
}
}
}
}
let tmp = new ArrayData()
arr.forEach((item) => {
tmp.push(item)
})
tmp.bubbleSort()
console.log(tmp.times) // 21
其實還是有最佳化的空間的。舉個例子,假設一共8個數,第一輪迴圈,會把最大的數冒泡排到第8位,第二輪迴圈,會把第二大的數排到第7位,所以,本輪循壞其實沒必要考慮最後一位了。同理,下一輪迴圈就不需要考慮後兩位。改進後的程式碼如下:
function ArrayData () {
// ......
this.bubbleSort = function () {
let length = ret.length;
for (let i = 0; i ret[j + 1]) {
[ret[j], ret[j + 1]] = [ret[j + 1], ret[j]]
change = true
}
}
if (!change) {
break
}
}
}
}
let tmp = new ArrayData()
arr.forEach((item) => {
tmp.push(item)
})
tmp.bubbleSort()
console.log(tmp.times) // 18
選擇排序 遍歷陣列,找出最小的數排在第一位,第二輪迴圈找出第二小的數放在第二位,以此類推。
function ArrayData () {
// ......
this.selectionSort = function () {
let length = ret.length
for (let i = 0; i {
tmp.push(item)
})
tmp.selectionSort()
插入排序 把陣列分成前後兩部分,前面的一部分是排好序的,然後分別把後面一部分的數字插入到前面排好序的陣列中。所以,剛開始時設定第一個元素為排好序的部分,分別把後面的數字插入進來。
function ArrayData () {
// ......
this.insertSort = function () {
let length = ret.length
let j
for (let i = 1; i = 0 && ret[j] > currentNumber; j--) {
ret[j + 1] = ret[j]
}
ret[j + 1] = currentNumber
}
}
}
let tmp = new ArrayData()
arr.forEach((item) => {
tmp.push(item)
})
tmp.insertSort()
快速排序 選一個數作為基準數,遍歷數列,把比它
放到他前面,比他小的放到他後面,然後再對基準數前後的數列遞迴上述操作,直到數列長度為1。
function ArrayData () {
// ......
this.quickSort = function () {
quick(ret, 0, ret.length - 1);
function quick(array, left, right) {
let index
if (array.length > 1) {
index = partition(array, left, right)
if (left index) {
quick(array, index, right)
}
}
return array
}
function partition(array, left, right) {
let pivot = array[Math.floor((right + left) / 2)],
i = left,
j = right;
while (i pivot) {
j--
}
if (i {
tmp.push(item)
})
tmp.quickSort()
一句話實現快速排序。選擇第一個元素作為參考元素,利用filter把陣列分成大於參考元素和小於參考元素的兩個陣列,並對這兩個陣列遞迴呼叫快排函式。
function quickSort(arr) {
return arr.length item item > arr[0])))
}
希爾排序 希爾排序是把陣列按下標的一定增量分組,對每組進行插入排,隨著增量逐漸減少,每個陣列的長度越來越多,當增量減至1時,整個檔案恰被分成一組,演算法便終止。
function ArrayData () {
// ......
this.shellSort = function () {
let length = ret.length
for (let step = Math.floor(length / 2); step > 0; step = Math.floor(step / 2)) {
for (let i = 0; i = 0 && ret[j] > currentNumber; j -= step) {
ret[j + step] = ret[j]
}
ret[j + step] = currentNumber
}
}
}
}
let tmp = new ArrayData()
arr.forEach((item) => {
tmp.push(item)
})
tmp.shellSort()
歸併排序 歸併排序採用分治的思想,將已有序的子序列合併,得到完全有序的序列。所以我們把數列分割成不超過兩個元素的陣列,然後將其合併。
function ArrayData () {
// ......
this.mergeSort = function () {
ret = mergeSortFun(ret)
function mergeSortFun(arr) {
let length = arr.length
if (length {
tmp.push(item)
})
tmp.mergeSort()
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2558/viewspace-2805388/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 常見排序演算法排序演算法
- 常見的排序演算法 (下)排序演算法
- 常見的排序演算法分析(一)排序演算法
- 常見的JavaScript面試演算法JavaScript面試演算法
- 常見排序演算法總結排序演算法
- 常見排序演算法小結排序演算法
- Haskell常見排序演算法的實現Haskell排序演算法
- Java常見排序演算法之插入排序Java排序演算法
- JavaScript常見演算法集合JavaScript演算法
- Javascript常見演算法整理JavaScript演算法
- 演算法之常見排序演算法-氣泡排序、歸併排序、快速排序演算法排序
- PHP常見排序演算法學習PHP排序演算法
- 35.幾種常見的排序演算法排序演算法
- 10種python常見的排序演算法!Python排序演算法
- 幾種常見的排序演算法總結排序演算法
- JavaScript 中常見排序演算法詳解JavaScript排序演算法
- 常見演算法 PHP 實現 -- 堆排序演算法PHP排序
- 常見排序演算法及複雜度排序演算法複雜度
- 幾種常見排序演算法總結排序演算法
- 常見排序演算法-Python實現排序演算法Python
- 【Java資料結構與演算法筆記(一)】常見排序演算法及面試考點總結Java資料結構演算法筆記排序面試
- 常見的排序演算法:冒泡、快排、歸併排序演算法
- python實現常見的五種排序演算法Python排序演算法
- 說說常見的排序演算法有哪些?區別?排序演算法
- JavaScript實現常見查詢演算法JavaScript演算法
- JavaScript 的常見“陷阱”JavaScript
- 【筆記】內部排序演算法筆記排序演算法
- 常見的三種排序演算法(選擇,冒泡,計數)排序演算法
- Java常見排序演算法之插入排序-簡單的效能優化技巧Java排序演算法優化
- iOS面試筆記常見概念(一)iOS面試筆記
- 5個常見的JavaScript記憶體錯誤JavaScript記憶體
- python3實現幾種常見的排序演算法Python排序演算法
- 用 Java 實現常見的 8 種內部排序演算法Java排序演算法
- 常見排序演算法原理及JS程式碼實現排序演算法JS
- js 常見四種排序JS排序
- 【演算法】演算法圖解筆記_快速排序演算法圖解筆記排序
- 筆記本常見故障與排除方法筆記
- 七種常見的陣列排序演算法整理(C語言版本)陣列排序演算法C語言