您的位置:首页 > 其它

算法导论第二版习题试解-第二章思考题

2012-03-01 20:35 309 查看
如果您发现解答中出现错误、对于没有给出解答的题目你有好的答案或者解答有改进的地方,只要您觉得有问题的地方,您可以通过xiezhenjiang@foxmail.com和我联系,谢谢!

2-1 help me

2-2 给出冒泡排序的C语言实现吧,证明就略了:

#include <stdio.h>

void bubble_sort(int *A, int n);

int main(int argc, char *argv[])
{

int i;
int A[]={1,2,5,-1,3,55,-8,10,2};

bubble_sort(A, 8);

for(i = 0; i < 8; i++)
{
printf("%d ", A[i]);
}
return 0;
}

void bubble_sort(int *A, int n)
{
int i,j;

for(i = 0; i < n; i++)
{
for(j = 0; j < n-i-1; j++)
{
if(A[j] > A[j+1])
{
A[j] = A[j] + A[j+1];
A[j+1] = A[j] - A[j+1];
A[j] = A[j] - A[j+1];
}
}
}
}

2.3

1)



2)

y = a0;

e = 1;

for(i = 1; i < n; i++)

e = e *x;

y = y + ai*e

return y;

3)、4)证明略

2.4

a)(2,1)、(3,1)、(8,6)、(8,1)、(6,1)

b)当数组按递减顺序排列时,数组含有最多的逆序对。包好了n*(n-1)/2个逆序对

c)成正比

d)给出源代码:

#include <stdio.h>
#include <limits.h>

int merge_sort(int *A, int p, int r);
int merge2(int *A, int p, int q, int r);

int main(int argc, char *argv[])
{
int i;
int A[9] = {1,5,7,8,2,4,6,9, -1};
int v;
v = merge_sort(A, 0, 8);

for(i = 0; i < 9; i++)
{
printf("%d ", A[i]);
}

printf("\n%d\n", v);

return 0;
}

int merge_sort(int *A, int p, int r)
{
int q;
int v = 0;
if(p < r)
{
q = (p + r) / 2;
v += merge_sort(A, p, q);
v += merge_sort(A, q+1, r);
v += merge2(A, p, q, r);
}

return v;
}

int merge2(int *A, int p, int q, int r)
{
int length_l = q - p + 1;
int length_r = r - q;

int i,j,k;
int sum = 0;

int *L = (int *)malloc( (length_l) * sizeof(int) );
int *R = (int *)malloc( (length_r) * sizeof(int) );

for(i = 0; i < length_l; i++)
{
L[i] = A[p+i];
}

for(i = 0; i < length_r; i++)
{
R[i] = A[q+1+i];
}

i = j = 0;
k = p;

while(i < length_l && j < length_r)
{
if(L[i] >= R[j])
{
A[k++] = L[i++];
sum += length_r - j;/*这里是按非升序排列数组的,所以R[j]是R[]中第一个小于L[i],后面R[j+1]..R[length_r-1]都小于L[i]*/
}
else
{
A[k++] = R[j++];
}
}

while(i < length_l)
{
A[k++] = L[i++];
}

while(j < length_r)
{
A[k++] = R[j++];
}

free(L);
free(R);
return sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: