我必须使用递归函数按升序对数组进行排序。例如,给定输入
5 | 12 31 48 25 50
输出必须是
5 | 12 25 31 48 50
开头的数字是数组的大小。
我已经生成了这段代码(它必须使用递归函数):
#include <iostream>
using namespace std;
int minimo(int *A, int lung) {
if (lung == 1)
return A[0];
int k = minimo(A+1, lung-1);
return A[0] < k ? A[0] : k;
}
//sort function
void ordina(int *A, int lung) {
if (lung > 0) {
cout << minimo(A, lung) << " ";
ordina(A+1, lung-1);
}
}
int main() {
int lung;
int A[100];
cin >> lung;
for(int i = 0; i < lung; i++) {
cin >> A[i];
}
//print array
ordina(A, lung);
return 0;
}
上面的输入代码效果非常好,但是当我尝试使用负输入格式时,例如:
7 | 73 49 12 37 23 -14 -14
输出结果为:
7 | -14 -14 -14 -14 -14 -14 -14
你能解释一下为什么吗?
ordina
函数调用自身;我减少了长度,然后增加A+1
,这样min就不会在同一个数组上计算多次。还
return A[0] < k ? A[0] : k;
这里我检查A [0]中的项是否低于k但每次k都改变,因为递归函数在堆栈上每个“循环”都有不同的变量。我真的不明白为什么-14输入不起作用。有什么想法吗?
答案 0 :(得分:1)
返回位置(返回前递增),必要时进行交换。
#include <iostream>
using namespace std;
int minimo(int* A, int length) {
if (length ==1) {
return 0;
} else {
int position = minimo(A+1,length-1)+1;
if (A[0]<A[position]) {
return 0;
} else {
std::swap(A[0],A[position]);
return 0;
}
}
}
void ordina(int* A,int length) {
if (length>0) {
cout<< A[minimo(A,length)]<< " ";
ordina(A+1,length-1);
}
}
int main() {
int lung;
int A[100];
cin >> lung;
for(int i = 0; i < lung; i++) {
cin >> A[i];
}
//print array
ordina(A, lung);
return 0;
}
但是,它总是返回位置0,所以这不是代码的最终形式。演变代码不返回任何内容:
void minimo(int* A, int length) {
if (length > 1) {
minimo(A+1,length-1);
if (A[0]>A[1]) {
std::swap(A[0],A[1]);
}
}
}
void ordina(int* A,int length) {
if (length>0) {
minimo(A,length);
cout<< A[0]<< " ";
ordina(A+1,length-1);
}
}
答案 1 :(得分:1)
问题是你删除了数组的第一个元素,而不是迭代后的最小元素:
ordina(A+1, lung-1);
如果正确的元素更大,你可以做的就是交换元素。 min元素最终到达数组A [0]
的开头就像BubbleSort一样简单:
int minimo(int *A, int lung) {
if (lung == 1)
return A[0];
minimo(A+1, lung-1); //YOU DON'T NEED THE RESULT
if (A[0] > A[1])
std::swap(A[0], A[1])
return A[0];
}