1.问题
[描述算法问题,首选形式化方式(数学语言),其次才是非形式化方式(日常语言)]
对n个不同的数构成的数组A[1…n]进行排序,其中n=2^k
2.解析
[问题的理解和推导,可用电子版直接在此编写,也可用纸笔推导,拍照嵌入本文档]
3.设计
[核心伪代码]
void Mergesort(int arr[], int g, int d)//其中r表示原数组,Left是数组的起始下标,Right是数组的结束位置下标
如果数组不止一个元素时
将原始数组分为两部分,分治
对第一部分数组进行递归排序
对第二部分数组进行递归排序
对分治的数组进行递归合并
void Merge(int arr[],int g,int k,int d)
{
int i=g,j=k+1;
int m=0,n=0;
创建临时数组用于存放排列好的原数组 ,这个临时数组的大小是由每次函数输入的大小决定的
然后排序
while(i <= k) // 将第一部分多余的数值放置于临时数组后面
t[m++] = arr[i++];
while(j <= d) // 将第二部分多余的数值放置于临时数组后面,注这些多余的数值一定比之前排序的数值大
t[m++] = arr[j++];
// 下面要讲排序后的数组返回给原数组
m = 0; // 将m的值返回为0
for(n=g; n<=d; n++) // 返回排序的部分
arr[n] = t[m++];
}
4.分析
[算法复杂度推导]
5.源码
[github源码地址]
https://github.com/xujinyuanky/-/tree/master