zoukankan      html  css  js  c++  java
  • 归并排序的实现(内部)以及应用场景(外部)

    归并排序既可以进行内部排序也可以进行外部排序。归并排序的时间复杂度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;
    }
  • 相关阅读:
    回老家
    防疫针
    平安夜
    虎威威
    圣诞联欢会
    小老虎飞船
    电子积木
    打印
    周日大悦城
    又一年毕业季
  • 原文地址:https://www.cnblogs.com/Blog-day/p/5377846.html
Copyright © 2011-2022 走看看