咳咳
作为一名JSer,要用自己的方式表达出自己的想法。以下代码涉及到简单的ES5/ES6,过于缺乏ECMAScript基础的同学,可能不太适合你。
- 冒泡排序
function bubbleSort (arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = 0; j < arr.length; j++) {
if ( arr[j] > arr[i] ) {
[arr[i], arr[j]] = [arr[j], arr[i]] // 交换,ES6的解构
}
}
}
}
- 快速排序
// 递归 二分
function quickSort(arr) {
if (arr.length <= 1) {
return arr
}
var len = Math.floor(arr.length / 2)
var cur = arr.splice(len, 1)
var left = []
var right = []
arr.forEach( num => {
if (num < cur) {
left.push(num)
} else {
right.push(num)
}
})
return arguments.callee(left).concat(cur, arguments.callee(right))
}
- 选择排序
// 依次遍历i到n,从i + 1 到中找到最小的一个放置到i的位置
function selectionSort (arr) {
var minIndex = 0 // 存储最小元素的index
for (let i = 0; i < arr.length; i++) {
minIndex = i
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j
}
}
// 找到最小的,和i位置的元素交换
if ( i !== minIndex ) {
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]]
}
}
return arr
}
- 插入排序
/* 方案一:辅助数组方案 */
// 依次遍历i到n,找到每个元素对应的位置,插入
function insertionSort (arr) {
var newArr = []
arr.forEach( (num, index) => {
if ( index === 0 ) {
newArr.push(num)
} else {
// 记录数组初始长度
let len = newArr.length
for (let i = 0; i < newArr.length; i++) {
if ( num < newArr[i] ) {
newArr.splice(i, 0, num)
break;
}
}
// 如果数组长度和初始长度一致,则num为newArr最大,push即可
if ( newArr.length === len ) {
newArr.push(num)
}
}
})
return newArr
}
/* 方案二:单个数组方案 */
function insertionSort(arr) {
outer:
for (let i = 1; i < arr.length; i++) {
inter:
for (let j = i - 1; j >= 0; j--) {
if ( arr[i] < arr[j] && ( arr[i] > arr[j-1] || j === 0 ) ) {
// 前一个splice表示‘放’,后一个splice表示‘取’
arr.splice(j, 0, arr.splice(i, 1)[0])
break inter
}
}
}
return arr
}