归并排序的基本思想:
归并排序与快速排序比较类似,都是对数据进行划分,但与快速排序不同的是归并排序是将数据均分为左右两部分,左右两半部分继续进行划分直到划分为一个数组中只有一个元素,这个数组在它所在部分为有序,然后将左右两个有序数组归并为一个有序数组。
MergeData()函数实现将两个有序数组归并为一个有序数组
原理:借助辅助空间,将两个数组里的数据搬移到tmep中
void MergeData(int* array,int left,int right,int mid,int* temp)//将两组有序的数组归并为一个有序的数组
{
int begin1 = left,end1 = mid;
int begin2 = mid,end2 = right;
int index = left; //索引 元素放在temp的位置
while(begin1 < end1 && begin2 < end2)
{
if(array[begin1] <= array[begin2])
temp[index++] = array[begin1++];
else
temp[index++] = array[begin2++];
}//循环结束后一个数组的值已经搬运完成
while(begin1 < end1)
{
temp[index++] = array[begin1++];
}
while(begin2 < end2)
{
temp[index++] = array[begin2++];
}
}
MergeSort()归并排序函数
//将数据均分为两部分,对左右两半部分继续进行划分直到划分为数组中只有一个数据 过程是递归的
//在划分完成后 对两个有序数组进行归并 过程是递归的 递归结束后数据有序
void _MergeSort(int* array,int left,int right,int *temp)
{
int mid = 0;
if(right - left > 1)
{
//mid = left + ((right - left)>>1);
mid = (right + left) >>1;
_MergeSort(array,left,mid,temp);
_MergeSort(array,mid,right,temp);
MergeData(array,left,right,mid,temp);
memcpy(array+left,temp+left,sizeof(array[0])*(right - left));将temp中的数据复制到array中
}
}
void MergeSort(int* array,int size)//对_MergeSort()封装
{
int* temp = (int*)malloc(sizeof(array[0])*size);
if(NULL == temp)
{
assert(0);
return;
}
_MergeSort(array,0,size,temp);
free(temp);
}
归并排序的特性总结:
稳定性: 稳定
时间复杂度 :
空间复杂度:
应用:解决在磁盘中的外部排序问题
缺点:归并的缺点在于需要O(N)的空间复杂度
本文深入讲解了归并排序的基本思想及其实现过程,包括如何通过递归将数据均分为两部分,直至每个子数组仅含一个元素,再将这些有序子数组合并成一个大数组。文章还探讨了归并排序的稳定性、时间与空间复杂度,以及其在磁盘外部排序问题上的应用。

576

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



