冒泡排序:(把大的移到后面)
【最坏和平均度为O(n^2);可通过添加flag判断当前轮是否已经有序来终止,最好为O(n)】
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]){
let temp = arr[j+1]
arr[j+1] = arr[j]
arr[j] = temp
}
}
}
return arr
}
选择排序:(始终让idx前面有序)
【三项均为O(n^2)】
function selectionSort(arr){
for(let i = 0; i < arr.length-1; i ++){
let idx = i
for(let j = i+1; j < arr.length; j ++){
if(arr[j] < arr[idx]){
idx = j
}
}
let temp = arr[idx]
arr[idx] = arr[i]
arr[i] = temp
}
return arr
}
快速排序:(找一个分界点,大于左边、小于右边,分治思想)
【最坏O(n^2),最好和平均O(nlogn)】
function quickSort(arr){
const pivot = Math.floor(Math.random() * arr.length)
const left = []
const right = []
const base = arr.splice(pivot,1)[0]
for (let i = 0; i < arr.length; i++) {
if (nums[i] < base) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quickSort(left).concat([base],quickSort(right))
}
这里写的是out-place版本,我觉得最好理解。追求省内存可以使用in-place版本。
同时第二行代码是一个随机化优化。