归并排序采用的是一种分治的方式, 将整个乱序数组, 不断地裁切开来, 进行一一对比, 然后再返回有序的数组
function meregeSort(arr) {
if (arr.length < 2) {
return arr;
}
let mid = Math.floor(arr.length / 2);
let left = arr.slice(0, mid);
let right = arr.slice(mid);
let l = meregeSort(left);
let r = meregeSort(right);
return auxiliary(l, r);
}
function auxiliary(left, right) {
let res = [];
while (left.length && right.length) {
if (left[0] < right[0]) {
res.push(left.shift());
} else {
res.push(right.shift());
}
}
while (left.length) {
res.push(left.shift());
}
while (right.length) {
res.push(right.shift());
}
return res;
}
快速排序
快速排序是, 每次都选一个基准值, 将所有大于这个基准值的放在右边, 所有小于这个基准值的放在左边, 然后再对左右两边的两个范围内, 继续进行该操作, 直到整个数组排好序
function quickSort(arr, left, right) {
if (left < right) {
let element = arr[left];
let i = left;
let j = right;
while (left < right) {
while (i < j && arr[j] >= element) {
j -= 1;
}
if (i < j) {
arr[i++] = arr[j];
}
while (i < j && arr[i] <= element) {
i += 1;
}
if (i < j) {
arr[j--] = arr[i];
}
}
arr[i] = element;
quickSort(arr, left, i - 1);
quickSort(arr, i + 1, right);
}
}
function quicklySort(arr) {
if (arr.length <= 1) {
return arr;
}
let left = [];
let right = [];
let mid = Math.floor(arr.length / 2);
let value = arr.splice(mid, 1)[0];
for (let i = 0; i < arr.length; i++) {
if (arr[i] < value) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quicklySort(left).concat([value], quicklySort(right));
}