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