1.归并排序介绍:
归并排序遵循分治的三步法,具体的归并排序可以分为以下三部分:
划分问题:把待排序的序列分成元素个数尽量相等的两半。
递归求解:把两半元素分别排序。
合并问题:把两个有序表合并成一个。
前两部分是很好实现的,关键是两个排好序的序列,怎么合并到一起呢?这要借助一个辅助数组,每次让两个已经排好序的序列的最小元素进行比较(利用下标),选出较小的元素加入到辅助数组,下标后移。如果一个序列中数据已经全部进入辅助数组,则要将另一个序列中的数据赋值给辅助数组。
代码实现
void merge_sort(int *a,int start,int end,int *temp)
{
int mid = start+(end-start)/2;
int i=start,j=mid,k=start;
merge_sort(a,start,mid,temp);
merge_sort(a,mid,end,temp);
while(i<mid || j<end)
{
if(q >= y || (p < m && a[i]<=a[j]))
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++]
}
}
for(i = start; i < end; i++)
{
a[i] = temp[i];
}
}
非常精炼的代码,这个大牛“刘汝佳”写的,以前写的总是很累赘。小小的膜拜一下。
2.归并排序实现求逆序对:
给以序列a1,a2,a3,…,an,求有多少个有序对(i,j),使得i<j,但ai>aj。用分治方法和归并排序类似,不同的是要求出右边的每个j,左边有多少个数比aj大,具体实现看代码!(仔细想想哦!)
int merge_sort(int *a,int start,int end,int *temp)
{
int mid = start+(end-start)/2;
int i=start,j=mid,k=start;
int count=0;
int t1 =merge_sort(a,start,mid,temp);
int t2 =merge_sort(a,mid,end,temp);
while(i<mid || j<end)
{
if(q >= y || (p < m && a[i]<=a[j]))
{
temp[k++] = a[i++];
}
else
{
temp[k++] = a[j++];count+=mid-i;
}
}
count = count + t1 + t2;
return count;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架