1、sort()排序
const arr = [1, 3, 2, 7, 11, 44, 32, 5, 100, 78, 66, 9, 8]
arr.sort() //[1, 100, 11, 2, 3, 32, 44, 5, 66, 7, 78, 8, 9]
sort()
的问题很明显,它只比较最前面的数字!
如果想用sort正常排序怎么办呢?
const arr = [1, 3, 2, 7, 11, 44, 32, 5, 100, 78, 66, 9, 8]
arr.sort(function (a, b) {
return a - b//正序
}) //[1, 2, 3, 5, 7, 8, 9, 11, 32, 44, 66, 78, 100]
arr.sort(function (a, b) {
return b - a//倒序
}) //[100, 78, 66, 44, 32, 11, 9, 8, 7, 5, 3, 2, 1]
2、冒泡排序
-
思路
1、依次比较相邻的两个元素,如果前一个比后一个大,则交换位置;
2、第一轮的时候最后一个元素是最大的一个(以此类推,第二轮的时候倒数第二个元素是第二大的);
3、按照步骤一的方法进行相邻两个元素的比较,交换位置之后,由于最后一个元素已经是最大的了,所以最后一个元素不用参与下一轮比较(以此类推,第二轮结束后,后面的两个元素就不用参与下一轮的比较了)。 -
代码
function bubbleSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {//代表第几轮比较
for (let j = 0; j < arr.length - 1 - i; j++) {//每一轮的两两相邻元素比较
if (arr[j] > arr[j + 1]) {//相邻元素比较
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]//满足条件,交换位置
}
}
}
return arr
}
const array = [11, 2, 4, 3, 88, 90, 56, 33, 76, 100, 99, 60, 44]
bubbleSort(array)//[2, 3, 4, 11, 33, 44, 56, 60, 76, 88, 90, 99, 100]
3、快速排序
-
思路
1、取出数组中间的一个值pivot
;
2、定义两个空数组left
、right
;
3、循环数组中剩下的元素(步骤1之后的数组),和pivot
比较,比它小的放进left
,比它小的放进right
;
4、递归调用,left
、right
都使用快速排序处理。 -
代码
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
let pivotIndex = Math.floor(arr.length / 2)
let pivot = arr.splice(pivotIndex, 1)[0]
let left = []
let right = []
for (let i = 0; i < arr.length; i++) {
if (arr[i] < pivot) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return quickSort(left).concat([pivot], quickSort(right))
//return [...quickSort(left), pivot, ...quickSort(right)]//或者这么写,更直观一点
}
4、选择排序
-
思路
1、在数组中找到最小元素,放在起始位置;
2、从剩下的元素中,再找到第二小的元素,放在第二位;
3、以此类推,可以得到排好序的数组。 -
代码
function selectSort(arr) {
for(let i = 0; i < arr.length - 1; i++) {
let index = i
for(let j = i + 1; j < arr.length; j++) {
if(arr[j] < arr[index]) {
index = j
}
}
[arr[i], arr[index]] = [arr[index], arr[i]]
}
return arr
}