歸並排序的實現(內部)以及應用場景(外部)


歸並排序既可以進行內部排序也可以進行外部排序。歸並排序的時間復雜度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;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM