归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divide)成一些小的问题然后递归求解,而治(conquer)的阶段则将分的阶段得到的各答案”修补”在一起,即分而治之)。
递归代码实现:
void Merge(int array[], int *temp, int left, int mid, int right)
{
int start1 = left;
int end1 = mid;
int start2 = mid+1;
int end2 = right;
int index = left;
while(start1 <= end1 && start2 <= end2)
{
if(array[start1] < array[start2])
temp[index++] = array[start1++];
else
temp[index++] = array[start2++];
}
while(start1 <= end1)
temp[index++] = array[start1++];
while(start2 <= end2)
temp[index++] = array[start2++];
}
void MergeSort(int *array, int *temp, int left, int right)
{
if(left < right)
{
int mid = (left+right)/2;
MergeSort(array, temp, left, mid);
MergeSort(array, temp, mid+1, right);
Merge(array, temp, left, mid, right);
memcpy(array+left, temp+left, (right-left+1)*sizeof(array[0])); //递归到一组只有一个元素后合并,归并一次写一次。
}
}
void MergeSort(int array[], int size)
{
assert(array && size > 0);
int *temp = new int [size]; //开辟一块辅助内存
MergeSort(array, temp, 0, size-1);
delete [] temp;
}
非递归算法:
代码实现:
void Merge(int array[], int *temp, int left, int mid, int right)
{
int start1 = left;
int end1 = mid;
int start2 = mid+1;
int end2 = right;
int index = left;
while(start1 <= end1 && start2 <= end2)
{
if(array[start1] < array[start2])
temp[index++] = array[start1++];
else
temp[index++] = array[start2++];
}
while(start1 <= end1)
temp[index++] = array[start1++];
while(start2 <= end2)
temp[index++] = array[start2++];
}
void MergeSort(int *array, int *temp, int size )
{
int gap = 1; //刚开始是一个元素一个元素合并
while(gap < size)
{
for(int i = 0; i < size; i+=2*gap) //因为元素合并是一组一组相邻的元素合并的,所以这里要加2gap
{
int left = i;
int mid = left +gap-1;
int right = mid+gap;
Merge(array, temp, left,mid, right);
}
memcpy(array, temp, size*sizeof(array[0])); //这里是归并一趟完了,整个拷贝。如将整个gap=1归并完了,拷贝
gap =gap*2;
}
}
void MergeSort(int array[], int size)
{
assert(array && size > 0);
int *temp = new int [size]; //开辟一块辅助内存
MergeSort(array, temp, size);
delete [] temp;
}
时间复杂度为O(n*logn),没有最好的情况和最坏的情况,空间复杂度为O(n),是一个稳定的算法。 比较次数与待排序记录的初始化状态无关。
外部排序。磁盘文件排序