归并排序既可以进行内部排序也可以进行外部排序。归并排序的时间复杂度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; }