21xrx.com
2024-11-24 18:24:37 Sunday
登录
文章检索 我的文章 写文章
从零开始学习JavaScript算法
2023-06-16 11:22:21 深夜i     --     --
JavaScript算法 排序算法 查找算法 字符串处理算法 图论算法

JavaScript作为一种现代化的编程语言,已经被广泛应用于前端开发、后端开发、移动应用等多个领域。作为开发人员,掌握有效的算法和数据结构是十分必要的,它能够提高代码的可读性和性能,更好地解决实际问题。

本文将从最基础的算法入手,介绍一些常见的排序、查找、字符串处理、图论等算法,并且结合代码案例进行详细的解析。通过阅读本文,你可以更好地掌握JavaScript算法的精髓,提高自己的编程能力。

1. 排序算法

排序算法是一种将一组数据按照一定的规则进行排序的算法,常见的排序算法有冒泡排序、插入排序、归并排序、快速排序等。下面用代码案例介绍几种排序算法的实现。

(1)冒泡排序

冒泡排序是一种简单的排序算法,通过不断比较相邻两个元素的大小,将较大的元素往后移动。


function bubbleSort(arr) {

 for (let i = 0; i < arr.length; i++) {

  for (let j = 0; j < arr.length - 1 - i; j++) {

   if (arr[j] > arr[j + 1]) {

    [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];

   }

  }

 }

 return arr;

}

(2)归并排序

归并排序是一种分治算法,将序列分成若干个子序列进行排序,再将排好序的子序列合并起来。


function mergeSort(arr) {

 if (arr.length <= 1)

  return arr;

 

 const mid = Math.floor(arr.length / 2);

 const left = arr.slice(0, mid);

 const right = arr.slice(mid);

 return merge(mergeSort(left), mergeSort(right));

}

function merge(left, right) {

 const result = [];

 let i = 0,

  j = 0;

 while (i < left.length && j < right.length) {

  if (left[i] < right[j]) {

   result.push(left[i]);

   i++;

  } else {

   result.push(right[j]);

   j++;

  }

 }

 return result.concat(left.slice(i)).concat(right.slice(j));

}

2. 查找算法

查找算法是一种在数据集合中查找指定元素的算法,常见的查找算法有二分查找、散列表、二叉树查找等。下面用代码案例介绍常见的二分查找算法实现。

(1)二分查找

二分查找是一种通过不断排除数据集合的一半来查找元素的算法,要求查找的数据集合必须是有序的。


function binarySearch(arr, target) {

 let left = 0,

  right = arr.length - 1;

 while (left <= right) {

  const mid = Math.floor((left + right) / 2);

  if (arr[mid] === target)

   return mid;

   else if (arr[mid] < target) {

   left = mid + 1;

  } else

   right = mid - 1;

  

 }

 return -1;

}

3. 字符串处理算法

字符串处理算法是一种用于处理字符串的算法,常见的字符串处理算法有字符串匹配、字符串反转、字符替换等。下面用代码案例介绍一个常见的字符串匹配算法KMP算法的实现。

(1)KMP算法

KMP算法是一种通过匹配字符串前缀和后缀来减少字符串匹配次数的算法,它的核心是利用状态转移表来记录不匹配时应该跳转的位置。


function kmp(source, pattern) {

 const next = getNext(pattern);

 let i = 0,

  j = 0;

 while (i < source.length && j < pattern.length) {

  if (j === -1 || source[i] === pattern[j]) {

   i++;

   j++;

  } else {

   j = next[j];

  }

 }

 if (j === pattern.length)

  return i - j;

 

 return -1;

}

function getNext(pattern) {

 const next = [-1];

 let i = 0,

  j = -1;

 while (i < pattern.length - 1) {

  if (j === -1 || pattern[i] === pattern[j]) {

   i++;

   j++;

   next[i] = j;

  } else {

   j = next[j];

  }

 }

 return next;

}

4. 图论算法

图论算法是一种解决图论问题的算法,常见的图论算法有最短路径算法、最小生成树算法等。下面用代码案例介绍一个常见的最短路径算法Dijkstra算法的实现。

(1)Dijkstra算法

Dijkstra算法是一种通过不断扩展已经找到的最短路径来寻找更短路径的算法。


function dijkstra(graph, start) {

 const INF = 1 / 0;

 const dist = {};

 const visited = {};

 for (const v in graph) {

  dist[v] = INF;

  visited[v] = false;

 }

 dist[start] = 0;

 for (let i = 0; i < Object.keys(graph).length; i++) {

  const u = minDistance(dist, visited);

  visited[u] = true;

  for (const v in graph[u]) {

   if (!visited[v] && graph[u][v] > 0 && dist[u] !== INF && dist[u] + graph[u][v] < dist[v]) {

    dist[v] = dist[u] + graph[u][v];

   }

  }

 }

 return dist;

}

function minDistance(dist, visited) {

 let min = Infinity,

  minNode = null;

 for (const v in dist) {

  if (dist[v] < min && !visited[v]) {

   min = dist[v];

   minNode = v;

  }

 }

 return minNode;

}

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复