合并排序:
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
int arr[100];
for (int i = 0; i < n; i++) {
cin>> arr[i];
}
void mergesort(int arr,int n);
for(int i=0;i<n;i++){
cout<<arr[i];
}
return 0;
}
void merge(int* l, int* r, int mid, int x,int *arr) {
int i=0,j=0,k=0;
while(i<mid&&j<x){
if(l[i]<r[i]){
arr[k++]=l[i++];
}
else
{
arr[k++]=r[j++];
}
}
while(i<mid){
arr[k++]=l[i++];
}
while(j<x){
arr[k++]=r[j++];
}
}
void mergesort(int *arr, int n) {
if (n < 2) {
return;
}
int mid, x;
int* l, * r;
mid = n / 2;
x = n - mid;
l = new int[mid];
r = new int[x];
for (int i = 0; i < mid; i++) {
l[i] = arr[i];
}
for (int i = 0; i <x; i++) {
r[i] = arr[i];
}
mergesort(l, mid);
mergesort(r, x);
merge(l,r,mid,x,arr);
delete[] l;
delete[] r;
}
相同的阵列正在打印自身。
我做错了什么吗?
它说合并:未找到标识符
如何解决问题?
似乎由于使用指令
using namespace std;
编译器无法解决歧义。
使用限定名称,如::merge
。
例如
::merge(l,r,mid,x,arr);
在你的main()
中,void mergesort(int arr,int n);
行是一个函数声明(它与函数的实际实现不匹配(。 你只是在宣告mergesort()
,你实际上并没有在召唤它。 因此,您正在打印与输入相同的数组,因为您实际上根本没有对数组进行排序。
试试这个:
void mergesort(int *arr,int n); // <-- fixed and moved up here!
int main() {
int n;
cin>>n;
int arr[100];
for (int i = 0; i < n; i++) {
cin>> arr[i];
}
for(int i=0;i<n;i++){
cout<<arr[i]; // <-- added so you can see the array before it is modified!
}
cout<<endl;
mergesort(arr,n); // <-- actually call it now!
for(int i=0;i<n;i++){
cout<<arr[i]; // <-- now the array is printed out as modified!
}
return 0;
}
void merge(int* l, int* r, int mid, int x,int *arr) {
...
}
void mergesort(int *arr, int n) {
...
}
现场演示
也就是说,您的mergesort()
函数无法正确对数组进行排序,即输入5 4 5 2 1 3
将数组排序为44444
。 但这是一个不同的问题,您应该单独发布一个新问题。