归并排序(Merge Sort)是建立在归并操作上的一种有限、稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
归并排序是一种稳定性排序
void _merge(int arr[],int left,int right);
void _merge_in(int arr[],int left,int mid,int right);
//---归并排序---
void MergeSort(int arr[],int len)
{
_merge(arr,0,len-1);
}
void _merge(int arr[],int left,int right)
{
//---递归操作---
if (left >= right)
return;
int mid = ((right - left)>>1) + left;
_merge(arr,left,mid);//左区间递归
_merge(arr,mid+1,right);//右区间递归
//---合并操作---
_merge_in(arr,left,mid,right);
}
void _merge_in(int arr[],int left,int mid,int right)
{
//---动态开辟一个辅助空间---
int len = right - left +1;
int *pData = new int[len];
memset(pData,0,sizeof(int)*len);//内存逐字节赋值
int low = left;//左区间第一个位置
int hig = mid+1;//右区间第一个位置
int index = 0;//辅助空间下标
while (low<=mid && hig<=right)//左右区间都存在
{
//左区间存在,且左区间值<=右区间值
while (low<=mid && arr[low]<=arr[hig])
{
pData[index] = arr[low];
low++;
index++;
}
//右区间存在,且右区间值<=左区间值
while (hig<=right && arr[low]>=arr[hig])
{
pData[index] = arr[hig];
hig++;
index++;
}
}
//---到这一步,有一区间一定是操作完的---
if (low<=mid)//左区间没操作完
memmove(&pData[index],&arr[low],sizeof(int)*(mid-low+1));
if (hig<=right)//右区间没操作完
memmove(&pData[index],&arr[hig],sizeof(int)*(right-hig+1));
//将辅助数组拷贝到原数组
memmove(&arr[left],pData,sizeof(int)*len);
delete [] pData;
}
本文详细介绍了归并排序算法,包括其基于分治法的工作原理,递归调用的过程,以及合并操作中使用辅助空间的C++实现。重点展示了如何将两个有序区间合并为一个有序序列。
1298

被折叠的 条评论
为什么被折叠?



