• 归并排序的实现(内部)以及应用场景(外部)


    归并排序既可以进行内部排序也可以进行外部排序。归并排序的时间复杂度O(N*lgN),空间复杂度为O(N)

    在这种情况下可以使用外部归并排序:

    若外存中还有N个文件记录,不能一次性读入内存,可以将外存中的文件记录分成若干长度为L的可以读进内存的段,并依次读入内存进行内部排序,将有序子文件(归并段)重新写入外存。然后对归并段进行逐趟归并,使归并段由小到大直到有序。但是在外部排序中实现两两归并时因为不能将两个有序段及归并结果段同时放在内存中,所以最主要的是进行外存的读写。

    //内部归并排序的主要代码

    void Mergeselction(int*a, int*tmp, int begin1, int end1, int begin2, int end2)//将两个归并段,归并成一个有序的归并段
    {
       assert(a);
       int index = begin1;
       while (begin1 <= end1&&begin2 <=end2)
       {
          if (a[begin1 ]<=a[begin2])
          {
             tmp[index++] = a[begin1++];
          }
          else
          {
              tmp[index++] = a[begin2++];
          }
      }
      while (begin1 <=end1)
      {
         tmp[index++] = a[begin1++];
      }
      while (begin2<=end2)
      {
         tmp[index++] = a[begin2++];
       }
    }
    
    ////////////
    
    void _MergeSort(int*a, int *tmp,int left, int right)
    {
       assert(a);
       if (left < right)
       {
         int mid = left + (right - left) / 2;
         _MergeSort(a, tmp, left, mid);
         _MergeSort(a, tmp, mid + 1, right);
         Mergeselction(a, tmp, left, mid, mid + 1, right);
         memcpy(a + left, tmp + left, (right - left + 1)*sizeof(int));
      }
    }
    
    //////////////
    void MergeSort(int *a, size_t size)
    {
       int *tmp = new int[size];
       _MergeSort(a, tmp, 0, size - 1);
       delete[] tmp;
    }
  • 相关阅读:
    javaWeb 使用jsp开发 if else 标签
    javaWeb 使用jsp开发 if 标签
    javaWeb 使用jsp标签进行防盗链
    javaWeb 在jsp中 使用自定义标签输出访问者IP
    javaWeb el表达式和jstl快速入门案例
    javaWeb 使用 jsp 和 javaBean 实现计算器功能
    javaWeb 使用cookie显示上次访问网站时间
    javaWeb 使用cookie显示商品浏览记录
    javaWeb request乱码处理
    ubunu下用命令设置壁纸
  • 原文地址:https://www.cnblogs.com/Blog-day/p/5377846.html
Copyright © 2020-2023  润新知