function swap(arr, i, j) {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
function bubbleSort(arr) {
for (let j = arr.length - 1; j >= 0; j--) {
for (let i = 0; i < j; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
}
}
}
}
function selectSort(arr) {
for (let j = 0; j < arr.length - 1; j++) {
let min = j;
for (let i = min + 1; i < arr.length; i++) {
if (arr[i] < arr[min]) {
min = i;
}
}
swap(arr, min, j);
}
}
function insertSort(arr) {
for (let j = 1; j < arr.length; j++) {
for (let i = j - 1; i >= 0 && arr[i] > arr[i + 1]; i--) {
swap(arr, i, i + 1);
}
}
}
function mergeSort(arr, l = 0, r = arr.length - 1) {
if (l == r) return arr[l];
let mid = l + ((r - l) >> 1);
mergeSort(arr, l, mid);
mergeSort(arr, mid + 1, r);
merge(arr, l, mid, r);
function merge(arr, l, mid, r) {
let helper = [];
let i = 0;
let p1 = l;
let p2 = mid + 1;
while (p1 <= mid && p2 <= r) {
helper[i++] = arr[p1] <= arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= mid) {
helper[i++] = arr[p1++];
}
while (p2 <= mid) {
helper[i++] = arr[p2++];
}
for (i = 0; i < helper.length; i++) {
arr[l + i] = helper[i];
}
}
}
function smallSum(arr) {
if (arr === null || arr.length < 2) {
return 0;
}
return process(arr, 0, arr.length - 1);
}
function process(arr, l, r) {
if (l === r) {
return 0;
}
let mid = l + ((r - l) >> 1);
return (
process(arr, l, mid) + process(arr, mid + 1, r) + merge(arr, l, mid, r)
);
}
function merge(arr, l, m, r) {
let helper = [];
let i = 0;
let p1 = l;
let p2 = m + 1;
let res = 0;
while (p1 <= m && p2 <= r) {
res += arr[p1] < arr[p2] ? (r-p2+1) * arr[p1] : 0
helper[i++] = arr[p1] < arr[p2] ? arr[p1++] : arr[p2++];
}
while (p1 <= m) {
helper[i++] = arr[p1++];
}
while (p2 <= r) {
helper[i++] = arr[p2++];
}
for (i = 0; i < helper.length; i++) {
arr[l + i] = helper[i];
}
return res;
}
console.log(smallSum([1,3,4,2,5]));
function quickSort(arr, l, r) {
if (l < r) {
swap(arr, Math.floor(l+Math.random() * (r-l+1)), r)
let p = partition(arr, l, r)
quickSort(arr, l, p[0] - 1)
quickSort(arr, p[1] + 1, r)
}
function partition(arr, l, r) {
let less = l - 1
let more = r
while (l < more) {
if (arr[l] < arr[r]) {
swap(arr, ++less, l++)
} else if (arr[l] > arr[r]) {
swap(arr, --more, l)
} else {
l++
}
}
swap(arr, more, r)
return [less + 1, more]
}
}
function generateRandomArray(maxSize, maxValue) {
const lens = Math.floor(Math.random() * (maxSize + 1));
let arr = new Array(lens);
for (let i = 0; i < lens; i++) {
arr[i] =
Math.floor((maxValue + 1) * Math.random()) -
Math.floor((maxValue + 1) * Math.random());
}
return arr;
}
function copyArray(arr) {
if (arr === null) return null;
let res = new Array(arr.length);
for (let i = 0; i < arr.length; i++) {
res[i] = arr[i];
}
return res;
}
function compareArray(testTime, maxSize, maxValue, ...fns) {
for (let j = 0; j < fns.length; j++) {
for (let i = 0; i < testTime; i++) {
let arr = generateRandomArray(maxSize, maxValue);
let copyArr = copyArray(arr);
arr.sort((a, b) => a - b);
fns[j](copyArr);
if (arr.toString() !== copyArr.toString()) {
console.log(fns[j].name + "测试未通过!");
return;
}
}
console.log(fns[j].name + "测试通过!");
}
}
compareArray(6, 1000, 100, insertSort, selectSort, bubbleSort, mergeSort);