在前端開(kāi)發(fā)的時(shí)候,我們常常需要對(duì)數(shù)據(jù)進(jìn)行排序,從而更好的展示數(shù)據(jù)。在javascript中,有許多種排序算法可以使用,針對(duì)不同大小和類(lèi)型的數(shù)據(jù),可以選擇不同的算法進(jìn)行排序。下面,我們將會(huì)介紹一些常用的排序算法,并且通過(guò)具體的例子進(jìn)行說(shuō)明。
冒泡排序
function bubbleSort(arr) { let len = arr.length; for (let i = 0; i< len; i++) { for (let j = 0; j< len - 1 - i; j++) { if (arr[j] >arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; } let arr = [3, 1, 4, 2, 7, 5, 8, 6]; console.log(bubbleSort(arr)); // [1, 2, 3, 4, 5, 6, 7, 8]
冒泡排序是一種簡(jiǎn)單的排序算法,將相鄰的元素兩兩比較,如果前一個(gè)元素比后一個(gè)元素大,則交換兩個(gè)元素的位置。通過(guò)這種方式,每次都將最大的元素移動(dòng)到最后面,這樣就完成了一次排序。然后在對(duì)剩下的元素重復(fù)進(jìn)行相同的操作,最終就可以完成整個(gè)數(shù)組的排序。這種排序方式的時(shí)間復(fù)雜度為O(n^2),雖然效率低下,但是對(duì)于小數(shù)據(jù)量的排序,這是可以接受的。
選擇排序
function selectSort(arr) { let len = arr.length; let minIndex, temp; for (let i = 0; i< len - 1; i++) { minIndex = i; for (let j = i + 1; j< len; j++) { if (arr[j]< arr[minIndex]) { minIndex = j; } } [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]; } return arr; } let arr = [3, 1, 4, 2, 7, 5, 8, 6]; console.log(selectSort(arr)); // [1, 2, 3, 4, 5, 6, 7, 8]
選擇排序是一種簡(jiǎn)單直觀的排序算法,它的基本思想是每一趟從待排序的數(shù)據(jù)元素中選擇出最小(或最大)的一個(gè)元素,放在已排好序數(shù)據(jù)的末尾,直到全部待排序的數(shù)據(jù)元素排完。與冒泡排序不同的是,選擇排序在每次交換元素時(shí),都只進(jìn)行一次交換,因此相較于冒泡排序,選擇排序可以減少交換元素的次數(shù)。然而,這種排序方式的時(shí)間復(fù)雜度仍然是O(n^2)。
快速排序
function quickSort(arr) { function partition(arr, left, right) { let pivot = arr[Math.floor((left + right) / 2)]; let i = left; let j = right; while (i<= j) { while (arr[i]< pivot) { i++; } while (arr[j] >pivot) { j--; } if (i<= j) { [arr[i], arr[j]] = [arr[j], arr[i]]; i++; j--; } } return i; } function sort(arr, left, right) { if (arr.length >1) { let index = partition(arr, left, right); if (left< index - 1) { sort(arr, left, index - 1); } if (index< right) { sort(arr, index, right); } } return arr; } return sort(arr, 0, arr.length - 1); } let arr = [3, 1, 4, 2, 7, 5, 8, 6]; console.log(quickSort(arr)); // [1, 2, 3, 4, 5, 6, 7, 8]
快速排序是一種高效的排序算法,其基本思想是通過(guò)一趟排序?qū)⒁判虻臄?shù)據(jù)分割成獨(dú)立的兩部分,其中一部分的所有數(shù)據(jù)都比另外一部分的所有數(shù)據(jù)都小。然后再按照此方法分別對(duì)這兩部分?jǐn)?shù)據(jù)進(jìn)行快速排序,以此達(dá)到整個(gè)數(shù)據(jù)變成有序序列的目的。快速排序的時(shí)間復(fù)雜度為O(nlogn)或O(n^2),具體時(shí)間復(fù)雜度的確定取決于樞軸元素的選擇方式??焖倥判蚴浅S玫母咝判蛩惴ㄖ唬蠖鄶?shù)編程語(yǔ)言中都有相應(yīng)的快速排序?qū)崿F(xiàn)。
總結(jié)
以上就是javascript中一些常用的排序算法,基于不同的需求和數(shù)據(jù)量可以選擇不同的算法進(jìn)行操作。這些算法雖然實(shí)現(xiàn)方式不同,但是都有類(lèi)似的時(shí)間復(fù)雜度。在實(shí)際開(kāi)發(fā)中,如果面對(duì)大規(guī)模的數(shù)據(jù)排序,可以采用一些高端優(yōu)化策略來(lái)進(jìn)一步提高效率。