一、冒泡排序
function bubble(arr) {
for(let i = arr.length - 1; i > 0; i--) {
for(let j = 0; j < i; j++) {
if(arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]]
}
}
console.log(arr);
}
return arr
}
var arr = [3, 10, 6, 2]
console.log(bubble(arr));
二、插入排序
function insertion(arr) {
for(let i = 1; i < arr.length; i++) {
let j = i
while( j > 0 && arr[j] < arr[j -1]) {
[arr[j], arr[j-1]] = [arr[j-1], arr[j]]
j--
}
console.log(arr);
}
return arr
}
var arr = [3, 10, 6, 2]
console.log(insertion(arr));
三、选择排序
function selection(arr) {
for(let i = 0; i < arr.length - 1; i++) {
let minIndex = i
for(let j = i+1; j < arr.length; j++) {
minIndex = arr[j] < arr[minIndex] ? j : minIndex
}
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
console.log(arr)
}
return arr
}
var arr = [3, 10, 6, 2]
console.log(selection(arr));
四、归并排序
function mergeSort(arr) {
let n = arr.length
if(n == 1) return arr
const middle = Math.floor(n/2)
const left = mergeSort(arr.slice(0, middle))
const right = mergeSort(arr.slice(middle))
console.log(left, right);
return merge(left,right)
}
function merge(left, right) {
let i = 0,j = 0
const result = []
while(i < left.length && j < right.length) {
if(left[i] < right[j]) {
result.push(left[i++])
} else {
result.push(right[j++])
}
}
while(i < left.length) {
result.push(left[i++])
}
while(j < right.length) {
result.push(right[j++])
}
return result
}
var arr = [3, 10, 6, 2]
console.log(mergeSort(arr));
五、快速排序
function quickSort(arr) {
if(arr.length <= 1) return arr
let mid = Math.floor(arr.length/2),
midNum = arr.splice(mid, 1)[0]
let left = [],right = []
arr.forEach(item => {
item > midNum ? right.push(item) : left.push(item)
})
console.log(left, midNum, right);
return quickSort(left).concat(midNum).concat(quickSort(right))
}
var arr = [3, 10, 6, 2]
console.log(quickSort(arr));
function quickSort2(arr, left, right) {
if(left < right) {
let i = left,
j = right,
empty = arr[left]
while(i < j) {
while(arr[j] > empty && i < j) {
j--
}
arr[i] = arr[j]
console.log('1',arr);
while(arr[i] < empty && i < j) {
i++
}
arr[j] = arr[i]
console.log('2',arr);
console.log(i, j);
}
arr[i] = empty
quickSort2(arr,left,i)
quickSort2(arr,i+1,right)
return arr
} else {
return
}
}
var arr = [3, 10, 6, 2]
console.log(quickSort2(arr, 0, 3));
1 [ 2, 10, 6, 2 ]
2 [ 2, 10, 6, 10 ]
1 3
1 [ 2, 10, 6, 10 ]
2 [ 2, 10, 6, 10 ]
1 1
1 [ 2, 3, 6, 10 ]
2 [ 2, 3, 6, 10 ]
0 0
1 [ 2, 3, 6, 10 ]
2 [ 2, 3, 6, 10 ]
2 2
[ 2, 3, 6, 10 ]
六、希尔排序
function shellSort(arr) {
let len = arr.length
let gap = Math.floor(len / 2)
while(gap > 0) {
for(let i = gap; i < len; i++) {
let j = i
while(j - gap >= 0 && arr[j] < arr[j-gap]) {
[arr[j],arr[j-gap]] = [arr[j-gap],arr[j]]
j -= gap
}
}
gap = Math.floor(gap/2)
}
return arr
}
var arr = [3, 10, 6, 2, 7, 4, 1, 9, 5, 8]
console.log(shellSort(arr));
七、堆排序
function heapSort(arr) {
buildMaxHeap(arr)
let len = arr.length - 1
for(let i = len; i > 0; i--) {
[arr[0], arr[i]] = [arr[i], arr[0]]
maxHeapify(arr, 0, len)
len--
}
return arr
}
function buildMaxHeap(arr) {
const len = arr.length
for(let i = Math.floor(len/2) - 1; i>=0; i--) {
maxHeapify(arr, i ,len)
}
}
function maxHeapify(arr, index, size) {
const left = 2*index + 1
const right = 2*index + 2
let largest = index
if(left < size && arr[left] > arr[largest]) {
largest = left
}
if(right < size && arr[right] > arr[largest]) {
largest = right
}
if(largest != index) {
[arr[index], arr[largest]] = [arr[largest], arr[index]]
maxHeapify(arr, largest, size)
}
}
var arr = [3, 10, 6, 2, 7, 4, 1, 9, 5, 8]
console.log(heapSort(arr));