归并排序,是建立在归并操作上的一种有效的排序算法,核心思路是将序列分为序列分为许多子序列,再使每个子序列有序化后,将子序列合并
归并排序的基本思想,先将序列一分为二,获得左右两个序列,再将子序列一分为二,以此类推得到最小的序列,因此归并排序也需要递归思想。
分解流程
每次取一半,分为两个子序列

合并流程
将子序列有序排列后合并起来

合并子序列,就进行排序,此时需要引入一个临时数组

void dealmergesort(int* arr,int* temp,int start,int end)
{
if (start >= end){
return;
}
int mid = (start + end) / 2;
dealmergesort(arr, temp, start, mid);
dealmergesort(arr, temp, mid + 1, end);
int left = start; //左侧数组的起始指针
int right = mid + 1; //右侧数组的起始指针
int merge = left; //temp的起始指针
for (; left <= mid && right <= end;merge++)
{
if (arr[left] <= arr[right])
{
temp[merge] = arr[left];
left++;
}
else
{
temp[merge] = arr[right];
right++;
}
}
for (; left <= mid; left++, merge++)
{
temp[merge] = arr[left];
}
for (; right <= end; right++, merge++)
{
temp[merge] = arr[right];
}
for (int i = start; i <= end; i++)
{
arr[i] = temp[i];
}
}
void mergesort(int* arr, int n)
{
int* temp = (int*)malloc(n*sizeof(int));
dealmergesort(arr, temp, 0, n-1);
free(temp);
}
归并排序是一种基于归并操作的高效排序算法,通过递归将序列不断拆分成子序列,然后有序合并。该算法首先将序列拆分成两半,再对每个子序列进行相同操作,直到得到单元素序列,最后通过合并有序子序列完成排序。实现过程中通常使用临时数组来辅助合并过程。
1119

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



