var arr = [123, 203, 23, 13, 34, 65, 65, 45, 89, 13, 1]
/**
* 选择排序
* 首先在未排序数组中找到最小(大)元素,存放在数组的起始位置。
* 再从剩余数组元素中继续寻找最小(大)元素,返回放在已排序数组的末尾
*/
function sort1(arr) {
for (var i = 0; i < arr.length; i++) {
for (var j = i + 1; j < arr.length; j++) {
//如果第一个比第二个大,就交换他们两个位置
if (arr[i] > arr[j]) {
;[arr[j], arr[i]] = [arr[i], arr[j]]
}
}
}
return arr
}
// console.log(sort1(arr))
/**
* 冒泡排序
* 次比较两个相邻的数,如果不符合规则互换位置,一次比较就能够将最大或最小的值放在数组最后一位
* 继续对除【最后一位】之外的所有元素重复上述过程
*/
function sort2(arr) {
for (var i = 0; i < arr.length - 1; i++) {
//每一轮比较要比多少次
for (var j = 0; j < arr.length - 1 - i; j++) {
//如果第一个比第二个大,就交换他们两个位置
if (arr[j] > arr[j + 1]) {
;[arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
}
}
}
return arr
}
// console.log(sort2(arr))
/**
* 插入排序
* 将数组第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
* 从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。
* 如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。
*/
function sort3() {
var preIndex, current
for (var i = 1; i < arr.length; i++) {
preIndex = i - 1
current = arr[i]
while (preIndex >= 0 && arr[preIndex] > current) {
arr[preIndex + 1] = arr[preIndex]
preIndex--
}
arr[preIndex + 1] = current
}
return arr
}
// console.log(sort3(arr))
/**
* 快速排序
* 在已知数据集合中随便去一个基准(pivot)
* 将其余数据以基准为中心,大于分放右边,小于的放左边
* 将左右两个子集重复以上两个步骤
*/
function quickSort(arr) {
//递归终止条件
if (arr.length <= 1) {
return arr
}
//取基准
var midIndex = Math.floor(arr.length / 2)
var mid = arr.splice(midIndex, 1)[0]
//分左右
var leftArr = []
var rightArr = []
for (var i = 0; i < arr.length; i++) {
if (arr[i] > mid) {
rightArr.push(arr[i])
} else {
leftArr.push(arr[i])
}
}
return [...quickSort(leftArr), mid, ...quickSort(rightArr)]
}
console.log(quickSort(arr))