每趟结束时的状态。请高手写一下,谢谢。
/*
设置的步长不同,每趟的结束就不同
步长为1时:答案如图
*/
#include <iostream>
#include <ctime>
#include <cstring>
using namespace std;
/**将a开头的长为length的数组和b开头长为right的数组 合并 n为数组长度,用于最后一组 */
void Merge(int* data, int a, int b, int length, int n)
{
int right;
if(b+length-1 >= n-1)
right = n-b;
else right = length;
int* temp = new int[length+right];
int i = 0, j = 0;
while(i<=length-1&&j<=right-1)
{
if(data[a+i] <= data[b+j])
{
temp[i+j] = data[a+i];
i++;
}
else
{
temp[i+j] = data[b+j];
j++;
}
}
if(j == right)
{
// a中还有元素,且全都比b中的大,a[i]还未使用
memcpy(data+a+i+j, data+a+i,(length-i)*sizeof(int));
}
memcpy(data+a, temp, (i+j)*sizeof(int) );
delete temp;
}
void MergeSort(int* data, int n)
{
int step = 1;
while(step < n)
{
for(int i = 0; i <= n-step-1; i += 2*step)
Merge(data, i, i+step, step, n);
// 将i和i+step这两个有序序列进行合并 // 序列长度为step // 当i以后的长度小于或者等于step时,退出
step *= 2;
for(int j = 0; j < n; j++)
{
cout<<data[j]<<" ";
}
cout<< endl;
}
}
int main()
{
int n;
cin >> n;
int *data = new int[n];
if(!data) exit(1);
int k = n;
while(k --)
{
cin >> data[n-k-1];
}
clock_t s = clock();
MergeSort(data, n);
clock_t e = clock();
k = n;
while(k --)
{
cout << data[n-k-1] << ' ';
}
cout << endl;
cout << "the algrothem used " << e-s << " miliseconds."<< endl;
delete data;
return 0;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。