js排序算法
let array = Array.from({ length: 1000000 }, (_, i) => i);
function fisher_yates_shuffle(arr) {
for (let i = 0; i < arr.length - 1; i++) {
const j = i + Math.floor(Math.random() * (arr.length - i));
[arr[i], arr[j]] = [arr[j], arr[i]]
}
return arr;
}
function outOfOrder(arr) {
return arr.sort(() => Math.random() - .5)
}
console.time('quick')
array = outOfOrder(array)
console.timeEnd('quick')
console.time('slow');
array = fisher_yates_shuffle(array);
console.timeEnd('slow');
function insert_sort(arr) {
for (let j = 1; j < arr.length; j++) {
const key = arr[j];
let i = j - 1
while (i >= 0 && arr[i] > key) {
arr[i + 1] = arr[i]
i--
}
arr[i + 1] = key
}
return arr
}
function quickSort(arr) {
let left = []
let right = []
let mid = []
let key = arr[0]
if (arr.length < 2) {
return arr
}
for (let i = 0; i < arr.length; i++) {
if (arr[i] < key) {
left.push(arr[i])
} else if (arr[i] > key) {
right.push(arr[i])
} else {
mid.push(arr[i])
}
}
return quickSort(left).concat(mid, quickSort(right))
}
function bubbleSort(arr) {
for (let i = arr.length; i > 0; i--) {
for (let j = 1; j < i; j++) {
if (arr[j - 1] < arr[j]) {
let t = arr[j - 1]
arr[j - 1] = arr[j]
arr[j] = t
}
}
}
return arr
}
function bucketSort(arr) {
const length = arr.length
const resArr = [...Array(length)].map(x => [])
const indexFunc = value => {
return value
}
arr.forEach(item => {
return resArr[indexFunc(item)].push(item)
})
return [].concat(...resArr)
}
function divide(f, l) {
return Math.floor((f + l) / 2)
}
function mergeSort(arr) {
if (arr.length < 2) return arr;
let mid = parseInt(arr.length / 2);
let left = arr.slice(0, mid);
let right = arr.slice(mid);
if (left == 'undefined' && right == 'undefined') return false;
return merge(mergeSort(left), mergeSort(right));
}
function merge(left, right) {
let result = [];
while (left.length && right.length) {
if (left[0] <= right[0]) {
result.push(left.shift())
} else {
result.push(right.shift())
}
}
left && result.push(left.shift())
right && result.push(right.shift())
return result;
}
function selectSort(arr) {
const length = arr.length
let minIndex, temp
for (let i = 0; i < length - 1; i++) {
minIndex = i
for (let j = i + 1; j < length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
temp = arr[i]
arr[i] = arr[minIndex]
arr[minIndex] = temp
}
return arr
}
function shellSort(arr) {
var len = arr.length,
temp,
gap = 1;
while (gap < len / 3) {
gap = gap * 3 + 1;
}
for (gap; gap > 0; gap = Math.floor(gap / 3)) {
for (var i = gap; i < len; i++) {
temp = arr[i];
for (var j = i-gap; j > 0 && arr[j]> temp; j-=gap) {
arr[j + gap] = arr[j];
}
arr[j + gap] = temp;
}
}
return arr;
}