排序算法:归并排序
递归实现
void _MergeSort(int* arr, int left, int right, int* tmp)
{
if (left >= right)
return;
int mid = left + (right - left) / 2;
_MergeSort(arr, left, mid, tmp);
_MergeSort(arr, mid + 1, right, tmp);
int begin1 = left;
int end1 = mid;
int begin2 = mid + 1;
int end2 = right;
int p = left;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] < arr[begin2])
{
tmp[p++] = arr[begin1++];
}
else
{
tmp[p++] = arr[begin2++];
}
}
while(begin1 <= end1)
tmp[p++] = arr[begin1++];
while (begin2 <= end2)
{
tmp[p++] = arr[begin2++];
}
for (int i = left; i <= right; i++)
{
arr[i] = tmp[i];
}
}
void MergeSort(int* arr, int sz)
{
int* tmp = (int*)malloc(sizeof(int) * sz);
_MergeSort(arr, 0, sz - 1, tmp);
free(tmp);
}
非递归实现
void MergeSort(int* arr, int sz)
{
int* tmp = (int*)malloc(sizeof(int) * sz);
int gap = 1;
while (gap < sz)
{
for (int i = 0; i < sz; i += 2 * gap)
{
int begin1 = i;
int end1 = begin1 + gap - 1;
int begin2 = end1 + 1;
int end2 = begin2 + gap - 1;
int index = begin1;
if (end1 >= sz)
end1 = sz - 1;
// begin2 越界,第二个区间不存在
if (begin2 >= sz)
{
begin2 = sz;
end2 = sz - 1;
}
// begin2 ok, end2越界,修正end2即可
if (begin2 < sz && end2 >= sz)
end2 = sz - 1;
while (begin1 <= end1 && begin2 <= end2)
{
if (arr[begin1] < arr[begin2])
tmp[index++] = arr[begin1++];
else
tmp[index++] = arr[begin2++];
}
while(begin1 <= end1)
tmp[index++] = arr[begin1++];
while(begin2 <= end2)
tmp[index++] = arr[begin2++];
for (int j = i; j < index; j++)
{
arr[j] = tmp[j];
}
}
//memcpy(arr, tmp, sizeof(int) * sz);//copy到arr也可以直接这样
gap *= 2;
}
free(tmp);
}
归并排序可以实现外排序。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具