const testData = [64, 34, 25, 12, 22, 11, 90]
const swap = (arr: number[], i: number, j: number) => {
if (arr.length === 0) return []
const temp = arr[i]
arr[i] = arr[j]
arr[j] = temp
}
function bubbleSort(arr: number[]) {
if (arr.length === 0) return []
const _arr = [...arr]
const n = _arr.length - 1
for (let i = 0; i < n; i++) {
for (let j = 0; j < n - i - 1; j++) {
if (_arr[j] > _arr[j + 1]) swap(_arr, j, j + 1)
}
}
return _arr
}
function selectSort(arr: number[]) {
if (arr.length === 0) return []
const _arr = [...arr]
const n = _arr.length - 1
for (let i = 0; i < n; i++) {
let minIndex = i
for (let j = i; j < n; j++) {
if (_arr[j] < _arr[minIndex]) minIndex = j
}
swap(_arr, i, minIndex)
}
return _arr
}
function insertSort(arr: number[]) {
if (arr.length === 0) return []
const _arr = [...arr]
const n = _arr.length - 1
for (let i = 0; i < n; i++) {
let preIndex = i - 1
const current = _arr[i]
while (preIndex >= 0 && _arr[preIndex] > current) {
_arr[preIndex + 1] = _arr[preIndex]
preIndex--
}
_arr[preIndex + 1] = current
}
return _arr
}
function shellSort(arr: number[]) {
if (arr.length === 0) return []
const _arr = [...arr]
const len = _arr.length
let gap = Math.floor(len / 2)
while (gap > 0) {
for (let i = 1; i < len; i++) {
let current = _arr[i]
let preIndex = i - gap
while (preIndex >= 0 && _arr[preIndex] > current) {
_arr[preIndex + gap] = _arr[preIndex]
preIndex -= gap
}
_arr[preIndex + gap] = current
}
gap = Math.floor(gap / 2)
}
return _arr
}
const merge = (left:number[],right:number[]) => {
const res:number[] = []
while(left.length && right.length){
if(left[0] < right[0]) res.push(left.shift() as number)
else res.push(right.shift() as number)
}
if(left.length) return res.concat(left)
if(right.length) return res.concat(right)
}
function mergeSort(arr:number[]):number[]{
if(arr.length < 2) return arr
const _arr = [...arr]
const len = _arr.length
const middle = Math.floor(len / 2)
const left = _arr.slice(0,middle)
const right = _arr.slice(middle)
return merge(mergeSort(left),mergeSort(right)) as number[]
}
function quickSort(arr: number[]): number[] {
if (arr.length === 0) return []
const left: number[] = [], right: number[] = []
const pivot = arr[0]
for (let i = 1; i < arr.length; i++) {
if (arr[i] < pivot) left.push(arr[i])
else right.push(arr[i])
}
return [...quickSort(left), pivot, ...quickSort(right)]
}
console.log(`冒泡:${bubbleSort(testData)}`);
console.log(`选择:${selectSort(testData)}`);
console.log(`插入:${insertSort(testData)}`);
console.log(`希尔:${shellSort(testData)}`);
console.log(`归并排:${mergeSort(testData)}`);
console.log(`快排:${quickSort(testData)}`);
console.log(`原始数组:${testData}`);