将排序代码与数组合并,陷入合并,只需要一点点修正
Merge Sort Code with array , stuck in merging, just need a little ammendment
void merge(int *a1, int *a2, int *a3, int s1, int s2, int s3){
s2 -=1;
int track =0;
s3-=1;
int p2=0;
int p3=0;
while(p2<s2 && p3 <s3){
if(a2[p2]<a3[p3])
a1[track++]=a2[p2++];
else
a1[track++]=a3[p3++];
}
while(p2<s2) a1[track++]=a2[p2++];
while(p3<s3) a1[track++]=a3[p3++];
}
void msort(int *array, int n){
if(n<=1) return;
int a1_size = n/2;
int a2_size = n-n/2;
int a1[n/2];
int a2[n-n/2];
for(int i=0;i<n/2;i++){
a1[i] = array[i];
}
for(int i=0,j=n/2;j<n;i++,j++){
a2[i] = array[j];
}
msort(a1, n/2);
msort(a2, n-n/2);
merge(array, a1, a2, n, a1_size, a2_size);
}
int main(){
int a[]={1,2,1,2,3,94,5,67};
msort(a,8);
for(int i=0;i<8;i++)
cout << a[i] << endl;
}
这是我的代码,我希望它会返回一个排序的数组。我知道问题是传递要合并的数组地址会修改数组内的数据,从而影响结果。我尝试了很长时间,但仍然不知道如何修正它。有人可以给我提示或帮助吗?
问题出在s2 -= 1
和s3 -= 1
语句中。你为什么要这样做?从零开始index
迭代数组的标准习惯用法是在index < length
时计数,而不是在index < length-1
时计数。
其他一些注意事项:
- 您分配了大量额外的内存(n*log(n( ints(,这些内存大部分时间都处于未使用状态。只需要在
merge
内部分配,这样最多可以随时分配n
int。 - 学习使用
std::vector
和/或迭代器范围而不是 C 样式数组
相关文章:
- 使用strcpy将char数组的元素复制到另一个数组
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 使用C++程序合并排序没有得到正确的输出
- 在 c++ 中拥有一组结构的正确方法是什么?
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- nlohmann-json将一个数组插入到另一个数组中
- 有没有一种方法可以在编译时获得作用域类名
- 为什么make_tie不是一件事
- 如何将一个数组值合并为一个整数c++
- 合并一组模板专用化
- 多边形裁剪 - 一点点详细说明
- 将排序代码与数组合并,陷入合并,只需要一点点修正
- 为什么一位数组返回零?合并排序测试
- 合并排序-一个数组中有四个排序部分
- 我的C++代码无法处理(一点点)快速的数据流量
- 如何将一种类型的多个值合并为另一种类型中的单个值
- 将包含指令合并到一个文件中是否是一种好的做法
- 在OpenCV中将两张撕破的纸合并成一张图像