- 算法构成
- 控制结构(顺序、分支、循环)
- 原操作(固有数据类型的操作)
- 常见js算法
var str = 'ddcflldkd';
function showMax(str) {
var array = str.split('');
var maxnum = 0, maxValue = '';
for (var i=0; i<array.length; i++) {
var count = 0;
for (var j=i+1; j<array.length-i; j++) {
if (array[i] == array[j]) {
count ++;
}
}
if (count > maxnum) {
maxnum = count;
maxValue = array[i];
}
}
return maxValue;
}
var value = showMax(str);
console.log('value', value);
const strChar = str => {
let array = [...str],
maxValue = '',
obj = {},
max = 0;
console.log('array', array);
array.forEach(value => {
obj[value] = obj[value] == undefined ? 1 : obj[value] +1;
if (obj[value] > max) {
max = obj[value];
maxValue = value;
}
});
return maxValue;
}
console.log(strChar(str));
var arr = ['1', '2', '3', '1', 'a', 'b', 'b'];
var i,j,len = arr.length;
for ( i = 0 ; i < len; i++) {
for ( j = i + 1; j < len; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
len--;
j--;
}
}
}
console.log('array', arr);
const unique = arr =>{
let obj = {};
arr.forEach(item => {
obj[item] = 1;
});
return Object.keys(obj);
}
console.log(unique(arr));
const unqiue = arr => {
return [...new Set(arr)];
}
const unqiue = arr => {
return arr.filter((ele, index, array) => {
return index === array.indexOf(ele);
});
}
console.log(unqiue(arr));
var i,j,len = arr.length,flag = 0;
for ( i = 0 ; i < len; i++) {
for ( j = i + 1; j < len; j++) {
if (arr[i] == arr[j]) {
arr.splice(j, 1);
len--;
j--;
flag = 1;
}
}
if (flag == 1) {
flag = 0;
arr.splice(i, 1);
len--;
i--;
}
}
var str = 'abbjnlfksc';
var array = str.split('');
console.log(array.reverse().join(''));
const str = 'abbjnlfksc';
const reverseStr = str => {
return [...str].reverse().join('');
};
console.log(reverseStr(str));
arr.sort(function(num1, num2){
return num1 - num2;
});
var value = arr[arr.length-1] - arr[0];
console.log('value', value);
const difference = arr => {
let max = Math.max(...arr),
min = Math.min(...arr);
return max - min;
}
console.log(difference(arr));
var a = 2,
b = 3,
[a, b] = [b, a];
console.log(a, b);
- 排序
- 冒泡排序 O(n^2) 遍历不断将最大的值推到最末位
var array = [4,9,12,5,3,7,6,17,33,21];
for (var i = 0; i < array.length - 1; i++) {
for (var j = 0; j < array.length - i - 1; j++) {
if (array[j] > array[j+1]) {
var temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
}
}
}
console.log('array', array);
function unqiue(array) {
var change = 0;
for (var i = 0; i < array.length - 1; i++) {
change = 1;
for (var j = 0; j < array.length - i -1; j++) {
if (array[j] > array[j+1]) {
var temp = array[j+1];
array[j+1] = array[j];
array[j] = temp;
change = 0;
}
}
if (change) { return array; console.log('dd')}
}
return array;
}
- 快速排序 O(nlogn) 对绝大多数顺序性较弱的随机数列而言,快排优于归并
const array = [9,4,12,5,3,7,6,17,33,21];
const sort = arr => {
if (arr.length <= 1) {
return arr;
}
const pivotIndex = Math.floor(arr.length/2);
const pivot = arr.splice(pivotIndex, 1)[0];
let left = [], right = [];
arr.forEach(a => {
a < pivot ? left.push(a) : right.push(a);
});
return sort(left).concat([pivot], sort(right));
}
console.log(sort(array));
- 选择排序 O(n^2) 原理和冒泡排序一致,遍历未排序区取最小(大)交换放置已排序区末尾
const sortSelect = arr => {
let minIndex;
for (let i = 0; i < arr.length - 1; i++) {
minIndex = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
return arr;
}
console.log(sortSelect(array));
- 插入排序 O(n^2) 假设第一个元素已经有序,从后向前遍历,比较,若小于交换向前继续比较,大于开始下一个元素对比
const insertSort = arr => {
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j > 0; j--) {
if (arr[j] < arr[j-1]) {
[arr[j], arr[j-1]] = [arr[j-1], arr[j]];
}else {
break;
}
}
}
return arr;
}
console.log(insertSort(array));
const insertTwoSort = arr => {
let tmp, left, right, mid;
for(let i = 1; i < arr.length; i++) {
tmp = arr[i];
left = 0;
right = i - 1;
while(left <= right) {
mid = parseInt((left + right) / 2);
if (tmp < arr[mid]) {
right = mid - 1;
}else {
left = mid + 1;
}
}
for (let j = i - 1; j >= left; j--) {
arr[j+1] = arr[j];
}
arr[left] = tmp;
}
return arr;
}
- 希尔排序 O(nlog n) 不定步数的插入排序,先分割子序列并在序列内进行插入排序,然后对整体进行一次直接插入排序
const sort = arr => {
let gap = parseInt(arr.length/2), tmp, j;
while(gap > 0) {
for (let i = gap; i < arr.length; i++) {
tmp = arr[i];
j = i - gap;
while(j >= 0 && tmp < arr[j]) {
arr[j+gap] = arr[j];
j = j - gap;
}
arr[j+gap] = tmp;
}
gap = parseInt(gap/2);
}
return arr;
}
- 归并排序 O(nlogn) 将无序的数组先拆分为N部分进行有序处理,然后合并
const sort = arr => {
const len = arr.length,
mid = Math.floor(len/2),
left = arr.slice(0, mid),
right = arr.slice(mid, len);
if (len < 2) return arr;
return merge(sort(left), sort(right));
}
const merge = (left, right) => {
let result = [];
while (left.length || right.length) {
if (left.length && right.length) {
if (left[0] < right[0]) {
result.push(left.shift());
}else {
result.push(right.shift());
}
}else if(left.length) {
result.push(left.shift());
}else {
result.push(right.shift());
}
}
return result;
}
- 堆排序 O(nlogn) 堆概念的选择排序
把最大堆堆顶的最大数取出,将剩余的堆继续调整为最大堆,再次将堆顶的最大数取出,这个过程持续到剩余数只有一个时结束
const swap = (arr, i , j) => {
let temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
const buildMaxHeap = arr => {
const iParent = Math.floor(arr.length/2) - 1;
for (let i = 0; i <= iParent; i++) {
maxHeapify(arr, i, arr.length);
}
}
const maxHeapify = (arr, i, heapSize) => {
let max, left, right;
while(true) {
max = i;
left = 2 * i + 1;
right = 2 * ( i + 1 );
if (left < heapSize && arr[i] < arr[left]) {
max = left;
}
if (right < heapSize && arr[max] < arr[right]) {
max = right;
}
if (max != i) {
swap(arr, max, i);
i = max;
}else {
break;
}
}
}
const sort = arr => {
buildMaxHeap(arr);
for (let i = arr.length - 1; i > 0; i--) {
swap(arr, 0 ,i);
maxHeapify(arr, 0, i);
}
return arr;
}