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

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;
}


自己尝试断点调试了一下但是不明要领。
关于内存和地址方面也不是十分的精通,请大师们看看我的代码,就此先谢过了。
...全文
127 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.

3,882

社区成员

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

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