day1
快排
1
var quicksort = function (arr) {
if (arr.length <= 1) {
return arr;
}
var middleindex = Math.floor(arr.length / 2); //取数组中间数的下标
var middle = arr.splice(middleindex, 1)[0]; //取数组中间值,但splice方法对数组进行拷贝操作最坏复杂度为O(n) 我也不知道为啥是O(n)
var left = [];
var right = [];
for (let i = 0; i < arr.length; i++) { //遍历数组将数组元素以中间值区分放入左右两边
if (arr[i] < middle) {
left.push(arr[i]);
} else {
right.push(arr[i]);
}
}
return quicksort(left).concat([middle], quicksort(right)); //递归左右两边的数组继续进行排序然后拼接返回
};
好像截图好看一点
2
function swap(arr, i, j) {
//交换数组元素
const t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
function sort(arr, left, right) {
const pivot = arr[right - 1]; //用于比较的数
let i = left - 1;
for (let j = left; j < right - 1; j++) {
//相当于获取数组小于基准的那部分,即0到i,所以遍历数组进行比较然后只要小于基准,则利用指针将值替换到对应的位置
if (arr[j] <= pivot) {
i++;
swap(arr, i, j);
}
}
swap(arr, i + 1, right - 1);
return i + 1;
}
function quicksort2(arr, left = 0, right) {
//总的思想是取出一个基准pivot将数组分为两块,然后再在两块分别递归排序
right = right || arr.length;
if (left < right - 1) {
const temp = sort(arr, left, right);
quicksort2(arr, left, temp);
quicksort2(arr, temp + 1, right);
}
return arr;
}
全排列
function quan(str) {
var result = [];
if (str.length == 1) {
result.push(str);
} else {
for (let i = 0; i < str.length; i++) {
var a = str[i];
var rest = str.slice(0, i) + str.slice(i + 1, str.length);
var lastresult = quan(rest);
for (let i = 0; i < lastresult.length; i++) {
var tmp = a + lastresult[i];
result.push(tmp);
}
}
}
return result;
}