假设我们有一个数字数组,我们想按元素大小来排序。
你可以有一个对象数组,你可以比较一个对象的属性,比如按年龄排序,或者按姓氏的字母顺序排序。这些细节都不会改变。
我们以这种方式工作:我们挑选第一个项目。然后我们将其与第二项进行比较。如果第二项比较小,我们就把它和第一项交换。以此类推,我们将第一个项目与数组中的每个项目进行比较。
一旦我们知道我们有最小的项目,我们就切换到第二个元素,并与数组中的每个项目进行比较,忽略索引0,因为我们已经知道那是最小的。以此类推,直到数组的末端。
正如你所看到的,这个算法是非常昂贵的。它不仅对数组中的每一项进行迭代:对于每一项,它又对数组进行迭代。
其复杂度为O(n^2) 。请注意,从技术上讲,我们所比较的项的数量一直在变小,但这对于复杂度的大O公约来说并不意味着什么。
下面是我们对选择排序的实现。
const selectionSort = (originalList) => {
//we first copy the array to avoid modifying the original array, since objects are passed by reference in JS
const list = [...originalList]
const len = list.length
for (let i = 0; i < len; i++) {
let min = i
for (let j = i + 1; j < len; j++) {
if (list[min] > list[j]) {
min = j
}
}
if (min !== i) {
// a new minimum is found. Swap that with the current element
;[list[i], list[min]] = [list[min], list[i]]
}
}
return list
}
const listOfNumbers = [1, 6, 3, 4, 5]
console.log(selectionSort(listOfNumbers)) //[1,3,4,5,6]