归并排序
归并排序也称外部排序,是内存中的数据过大一般不能处理的情况下,我们选择用外部排序来解决,归并排序也是一种分治的思想,其实它就是把所要排序的内存空间一直二分下去,直到不能再分,然后又进行合并的一种排序方法;
从上图中我们可以看到,其实归并排序也不是很难:
void MergeSort(int* array, int size)
{
int* tmp = new int[size]; //创建外部空间
for(size_t i =0; i < size; i++)
{
tmp[i] = array[i];
}
merge_sort(array tmp, 0, size-1);
delete[] tmp;
}
void merge_sort(int* array, int* tmp, int begin, int end)
{
assert(array);
assert(tmp);
if(begin == end)
return;
int mid = begin + (end-begin)>>1;
int begin1 = begin;
int end1 = mid;
int begin2 = mid+1;
int end2 = end;
merge_sort(array, tmp, begin1, end1); //进行左右递归
merge_sort(array, tmp, begin2, end2);
int t = begin;
while(begin1 <= end1 && begin2 <= end2)
{
if(array[begin1] > array[begin2])
tmp[t++] = array[begin2++];
else
tmp[t++] = array[begin1++];
}
while(begin1 <= end1)//轮空的也要归并回去
{
tmp[t++] = array[begin1++];
}
while(begin2 <= end2)
{
tmp[t++] = array[begin2++];
}
for(int i =0; i <= end; i++)//拷回原来的空间中去
{
array[i] = tmp[i];
}
}