自己动手写了个归并排序,但出现了问题

sunhao474 2014-11-22 04:56:23
晚辈看了书,了解了思想之后,自己尝试写了个一个归并排序,但是输出只能输出前两个正确的元素,后面的全是乱数


下面是代码。

#include <iostream>
using namespace std;

int* Merge(int left[], int right[]);
int* MergeSort(int n[], int start, int end);

int main()
{
int n[] ={5, 3, 7, 3, 6, 4};
int *m = MergeSort(n, 0 ,5);
for(int i = 0; i < 6;i++)
{
cout <<m[i]<< endl;
}
system("PAUSE");
}

int* MergeSort(int n[],int start, int end)
{
int mid = (start+end)/2;
cout << "--------------------------------------" << endl;
if(start == end)
{
return &n[start];
}
else
{
return Merge(MergeSort(n, start, mid), MergeSort(n, mid+1, end));
}
}

int* Merge(int left[], int right[])
{
int *n;//用于返回将两个子数组组合而成的新的有序数组
int left_length = sizeof(left)/4;//左边数组长度
int right_length = sizeof(right)/4;//右边数组长度
int length = left_length + right_length;//返回数组长度
n = new int[length];
int left_index = 0, right_index = 0;//用于标识当前子数组所比较的位置
int insert_index = 0;//插入返回数组的当前位置
while(insert_index < length)
{
if(left[left_index] > right[right_index])
{
n[insert_index] = left[left_index];
left_index++;
}
else if(left[left_index] <= right[right_index])
{
n[insert_index] = right[right_index];
right_index++;
}
else if(left_index == left_length - 1)
{
n[insert_index] = right[right_index];
right_index++;
}
else if (right_index == right_length - 1)
{
n[insert_index] = left[left_index];
left_index++;
}
insert_index++;
}


//cout << "______________________________________" << endl;
return n;
}


自己尝试断点调试了一下但是不明要领。
关于内存和地址方面也不是十分的精通,请大师们看看我的代码,就此先谢过了。
...全文
128 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
michael2988 2014-11-22
  • 打赏
  • 举报
回复
数组名当函数参数时,会自动退化为指针。相当于

int a[3];

int func(int ver[]);
// 调用,相当于传了一个 int *
func(a);
引用 2 楼 sunhao474 的回复:
[quote=引用 1 楼 michael2988 的回复:]
int left_length = sizeof(left)/4;//左边数组长度
int right_length = sizeof(right)/4;//右边数组长度
并不能获得数组的长度,数组名当函数参数时会退化为指针,sizeof(指针) 固定为长度4.
我定义了一个数组int n[] = {.....},使用
sizeof(n)/sizeof(n[0])
可以得到,但我使用int n[]作为一个函数的参数的时候,是否相当于只是传了数组的的一个指针过去?请问有什么办法取得这个参数数组的长度呢?[/quote]
sunhao474 2014-11-22
  • 打赏
  • 举报
回复
引用 1 楼 michael2988 的回复:
int left_length = sizeof(left)/4;//左边数组长度
int right_length = sizeof(right)/4;//右边数组长度
并不能获得数组的长度,数组名当函数参数时会退化为指针,sizeof(指针) 固定为长度4.
我定义了一个数组int n[] = {.....},使用
sizeof(n)/sizeof(n[0])
可以得到,但我使用int n[]作为一个函数的参数的时候,是否相当于只是传了数组的的一个指针过去?请问有什么办法取得这个参数数组的长度呢?
michael2988 2014-11-22
  • 打赏
  • 举报
回复
int left_length = sizeof(left)/4;//左边数组长度
int right_length = sizeof(right)/4;//右边数组长度
并不能获得数组的长度,数组名当函数参数时会退化为指针,sizeof(指针) 固定为长度4.
内容概要:本文深入剖析了多线程归并排序的原理与Python实现,结合分治思想与多线程技术,通过将数组分割为子数组并利用多线程并行排序,显著提升大规模数据的排序效率。文章详细介绍了归并排序的基础原理、多线程编程概念及Python中的threading模块应用,给出了完整的多线程归并排序代码实现,并通过性能测试对比单线程与多线程在不同数据规模下的表现,验证了多线程在处理大数据时的显著优势。同时探讨了其在大数据处理和分布式系统中的应用场景,并提出动态调整线程数、结合其他排序算法等优化方向。; 适合人群:具备Python编程基础,熟悉基本数据结构与算法,对多线程编程有一定了解的开发人员或计算机专业学生(工作或学习经验1-3年为宜)。; 使用场景及目标:①掌握归并排序的分治思想与合并逻辑;②理解多线程在算法并行化中的应用方式;③学习如何通过threading模块实现任务并行处理;④对比线程开销与并行收益,合理选择排序策略;⑤应用于大数据预处理、搜索引擎索引排序等高性能排序需求场景。; 阅读建议:建议读者结合代码逐段调试,亲自动手运行测试用例,观察不同数据规模下多线程与单线程的性能差异,并尝试实现动态线程分配或混合排序算法(如小数组改用插入排序)以加深理解。

3,882

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧