视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
JavaScript中归并排序的介绍(代码示例)
2020-11-27 19:28:15 责编:小采
文档
 本篇文章给大家带来的内容是关于JavaScript中归并排序的介绍(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(pide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

归并排序

归并排序是一种非常稳定的排序方法,它的时间复杂度无论是平均,最好,最坏都是NlogN。

归并排序的2个步骤

  1. 先拆分,一直拆分到只有一个数

  2. 拆分完成后,开始递归合并

拆分过程

从上图可以看出,归并排序会将一个数组进行两两拆分,一直拆分到只有一个数的时候停止拆分。
那么拆分的代码就很简单了,就是得到一个指向中间的指针q,将数组拆分成(start,p)和(p,end)两个部分。

  • p表示数组的开始下标

  • r表示数组的结束下标

  •  function pide(p, r){
     return Math.floor( (p + r) / 2 );
     }

    合并过程

    合并的过程就如上图所示

    1. 遍历两组数据

    2. 进行对比大小

    3. 较小的那个值取出来放在第一个位置

    举个例子:

  • 假设现在数组A的数据是[2,5,1,3]

  • 经过我们的拆分后会是(0,2),(2,4);

  • 我们通过A.slice(0,2)和A.slice(2,4)=>得到两个数组A1[2,5]和A2[1,3]

  • 然后我们对数组[2,5,1,3]进行遍历,第一次会得到两边较小的数1,第二次2,第三次3,第四次是5

  •  function merge(A, p, q, r){
     const A1 = A.slice(p, q);
     const A2 = A.slice(q, r);
     
     // 哨兵,往A1和A2里push一个最大值,比如防止A1里的数都比较小,导致第三次遍历某个数组里没有值
     
     A1.push(Number.MAX_SAFE_INTEGER);
     A2.push(Number.MAX_SAFE_INTEGER);
     // 循环做比较,每次取出较小的那个值
     for (let i = p, j = 0, k = 0; i < r; i++) {
     if (A1[j] < A2[k]) {
     A[i] = A1[j];
     j++;
     } else {
     A[i] = A2[k];
     k++;
     }
     }
     }

    主程序

    主程序就是做递归重复上面的操作了

     function merge_sort(A, p = 0, r) {
     r = r || A.length;
     if (r - p === 1) {
     return;
     }
     const q = pide(p, r);
     merge_sort(A, p, q);
     merge_sort(A, q, r);
     merge(A, p, q, r);
     
     return A;
     }

    完整代码

     function pide(p, r) {
     return Math.floor((p + r) / 2);
     }
     
     function merge(A, p, q, r) {
     const A1 = A.slice(p, q);
     const A2 = A.slice(q, r);
     A1.push(Number.MAX_SAFE_INTEGER);
     A2.push(Number.MAX_SAFE_INTEGER);
     
     for (let i = p, j = 0, k = 0; i < r; i++) {
     if (A1[j] < A2[k]) {
     A[i] = A1[j];
     j++;
     } else {
     A[i] = A2[k];
     k++;
     }
     }
     }
     
     function merge_sort(A, p = 0, r) {
     r = r || A.length;
     if (r - p === 1) {
     return;
     }
     const q = pide(p, r);
     merge_sort(A, p, q);
     merge_sort(A, q, r);
     merge(A, p, q, r);
     
     return A;
     }

    下载本文
    显示全文
    专题