js的数组排序算法及查找字符串中出现次数最多的字符算法
数组排序
- 冒泡排序(Bubble Sort)
要点:双层循环,依次比较相邻的两个值,如果后面的比前面的小,则将小的元素排到前面。内层循环次数为:最大值 – 1 – 当前的外层循环,因为前面值已经是最小值,无须重复比较。
function bubbleSort(arr) {
const len = arr.length;
for (let i = 0; i < len; i++) {
for (let j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j + 1]) { // 相邻两个元素对比
const temp = arr[j + 1]; // 元素交换
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
return arr;
}
console.log(bubbleSort([1, 5, 2, 5, 6, 8, 2, 9, 1, 2, 3]));
- 选择排序(Selection Sort)
要点:双层循环,内循环找到最小值的索引,在外层循环交换值
function selectionSort(arr) {
const len = arr.length;
let minIndex, temp;
for (let i = 0; i < len - 1; i++) {
minIndex = i;
for (let j = i + 1; j < len; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
return arr;
}
console.log(selectionSort([1, 5, 2, 5, 6, 8, 2, 9, 1, 2, 3]));
- 插入排序(Insertion Sort)
function insertionSort(arr) {
const len = arr.length;
let preIndex, current;
for (let i = 1; i < len; 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(insertionSort([1, 5, 2, 5, 6, 8, 2, 9, 1, 2, 3]));
查找字符串中出现次数最多的字符
- 用对象
const str = 'wfeuh@ufjdkncpskskunfljsefhfeslshlnnb,xmnznzhzissksk';
const obj = {};
// 先遍历出所有字符出现次数
for (let i = 0, len = str.length; i < len; i++) {
const char = str.charAt(i);
if (obj[char]) {
obj[char]++;
} else {
obj[char] = 1;
}
}
// 字符串出现次数集
console.log(obj);
// 出现次数最多的
let maxCount = 0;
let maxKey = ''
for (const key in obj) {
if (maxCount < obj[key]) {
maxKey = key;
maxCount = obj[key];
}
}
console.log(maxKey, maxCount)
- reduce
const str = 'wfeuh@ufjdkncpskskunfljsefhfeslshlnnb,xmnznzhzissksk';
const strArr = str.split('');
const obj = strArr.reduce(function(prev, next) {
if (next in prev) {
prev[next]++;
} else {
prev[next] = 1;
}
return prev;
}, {})
// 字符串出现次数集
console.log(obj)
// 出现次数最多的
let maxCount = 0;
let maxKey = ''
for (const key in obj) {
if (maxCount < obj[key]) {
maxKey = key;
maxCount = obj[key];
}
}
console.log(maxKey, maxCount)
- 正则
const str = 'wfeuh@ufjdkncpskskunfljsefhfeslshlnnb,xmnznzhzissksk';
const maxCountStr = (str) => {
// 转成数组,再排序,这样同样字符的集中在一起,再转成字符串
const newStr = str.split('').sort().join('');
// 正则按同样字符匹配拆成数组
const strArr = newStr.match(/(\w+)(\1)/g);
// 当没有重复的就返加第一个字符
if (strArr === null) {
return newStr[0];
}
// 倒序排序
outStrArr = strArr.sort((a, b) => b.length - a.length);
// 输出最大的,数组第一个
return { key: outStrArr[0][0], count: outStrArr[0].length }
}
console.log(maxCountStr(str))