我必须在c中编写一个程序,找出验证这种情况的对的数量:
i<j && a[i]>a[j]
a []是包含N个元素的数组
示例:给定 N = 4 且 a = {1,7,2,0} 对的数量 4 :< strong>(1,0),(7,2),(7,0),(2,0)
我编写的这段代码有效,但效率很低:
#include <stdio.h>
#include <stdlib.h>
#define N 4
int count(int a[],int i, int j);
int main(){
int i,c=0;
int a[]={1,7,2,0};
for(i=0; i<N-1;i++)
c+=count(a,i,N-1);
printf("%d",c);
return 0;
}
int count(int a[N], int i, int j){
if(j<0)
return 0;
if(i<j && a[i]>a[j])
return 1+count(a,i,j-1);
return 0+count(a,i,j-1);
}
另外,如何使用malloc实现数组的动态生成?我应该在count函数的main函数中创建数组吗?
答案 0 :(得分:3)
基本上,您希望计算数组中的反转。这可以使用具有合并排序算法的tehnique simillar来实现。我建议你看一下下面的文章:http://www.cs.umd.edu/class/fall2013/cmsc451/Lects/lect09.pdf。
谈到动态数组生成,您可能想要知道,自C99起,有variable length arrays(它们的大小不再需要是常量)。
如果你真的想要或者需要使用malloc,你应该先看一下指针。在你知道如何处理指针之后,一切都会很清楚,因为malloc只是设置了一个游乐场,你可以用指针来玩。
答案 1 :(得分:1)
我不确定你为什么要使用递归或它如何使它更快。我建议使用双循环,因为它更容易阅读:
for(i = 0 ; i < N-1 ; i++)
for(j = i+1 ; j < N ; j++)
c += (a[i]>a[j]) ? 1 : 0;
答案 2 :(得分:0)
一般来说,递归解决方案在递归后会有连续性(加法)。通过使用累加器作为一个参数来创建返回值,可以使它更好一些,对于某些编译器,递归将被优化为循环:
int count(int a[N], int i, int j)
{
return count_aux(a, i, j, 0);
}
int count_aux(int a[N], int i, int j, int acc)
{
if ( j<0 )
return acc;
else
return count_aux(a,i,j-1, ( i<j && a[i] > a[j] ? acc+1 : acc ));
}