算法導論第二版習題試解-第二章思考題

如果您發現解答中出現錯誤、對於沒有給出解答的題目你有好的答案或者解答有改進的地方,只要您覺得有問題的地方,您可以通過[email protected]和我聯繫,謝謝! 

2-1 help me

2-2 給出冒泡排序的C語言實現吧,證明就略了:

 

  1. #include <stdio.h>  
  2.  
  3. void bubble_sort(int *A, int n);  
  4.  
  5. int main(int argc, char *argv[])   
  6. {  
  7.  
  8.     int i;   
  9.     int A[]={1,2,5,-1,3,55,-8,10,2};  
  10.  
  11.     bubble_sort(A, 8);  
  12.  
  13.     for(i = 0; i < 8; i++)   
  14.     {   
  15.         printf("%d ", A[i]);   
  16.     }   
  17.     return 0;   
  18. }  
  19.  
  20. void bubble_sort(int *A, int n)   
  21. {   
  22.     int i,j;  
  23.  
  24.     for(i = 0; i < n; i++)   
  25.     {   
  26.         for(j = 0; j < n-i-1; j++)   
  27.         {   
  28.             if(A[j] > A[j+1])   
  29.             {   
  30.                 A[j] = A[j] + A[j+1];   
  31.                 A[j+1] = A[j] - A[j+1];   
  32.                 A[j] = A[j] - A[j+1];   
  33.             }   
  34.         }   
  35.     }   
  36. }  
  37.  
  38.    
  39.  

2.3

1)image

2)

 

  1. y = a0;  
  2.  
  3.       e = 1;  
  4.  
  5.       for(i = 1; i < n; i++)  
  6.  
  7.             e = e *x;  
  8.  
  9.             y = y + ai*e  
  10.  
  11.      return y;  
  12.  

3)、4)證明略

2.4

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

b)當數組按遞減順序排列時,數組含有最多的逆序對。包好了n*(n-1)/2個逆序對

c)成正比

d)給出源代碼:

 

  1. #include &lt;stdio.h>   
  2. #include <limits.h>  
  3.  
  4. int merge_sort(int *A, int p, int r);   
  5. int merge2(int *A, int p, int q, int r);  
  6.  
  7. int main(int argc, char *argv[])   
  8. {   
  9.     int i;   
  10.     int A[9] = {1,5,7,8,2,4,6,9, -1};   
  11.     int v;   
  12.     v = merge_sort(A, 0, 8);   
  13.  
  14.     for(i = 0; i < 9; i++)   
  15.     {   
  16.         printf("%d ", A[i]);   
  17.     }  
  18.  
  19.     printf("\n%d\n", v);   
  20.       
  21.     return 0;   
  22. }  
  23.  
  24. int merge_sort(int *A, int p, int r)   
  25. {   
  26.     int q;   
  27.     int v = 0;   
  28.     if(p &lt; r)   
  29.     {   
  30.         q = (p + r) / 2;   
  31.         v += merge_sort(A, p, q);   
  32.         v += merge_sort(A, q+1, r);   
  33.         v += merge2(A, p, q, r);   
  34.     }  
  35.  
  36.     return v;   
  37. }  
  38.  
  39.  
  40. int merge2(int *A, int p, int q, int r)   
  41. {   
  42.     int length_l = q - p + 1;   
  43.     int length_r = r - q;  
  44.  
  45.     int i,j,k;   
  46.     int sum = 0;  
  47.  
  48.     int *L = (int *)malloc( (length_l) * sizeof(int) );   
  49.     int *R = (int *)malloc( (length_r) * sizeof(int) );  
  50.  
  51.     for(i = 0; i < length_l; i++)   
  52.     {   
  53.         L[i] = A[p+i];   
  54.     }  
  55.  
  56.     for(i = 0; i < length_r; i++)   
  57.     {   
  58.         R[i] = A[q+1+i];   
  59.     }  
  60.  
  61.     i = j = 0;   
  62.     k = p;  
  63.  
  64.     while(i < length_l && j < length_r)   
  65.     {   
  66.         if(L[i] >= R[j])   
  67.         {   
  68.             A[k++] = L[i++];   
  69.             sum += length_r - j;/*這裏是按非升序排列數組的,所以R[j]是R[]中第一個小於L[i],後面R[j+1]..R[length_r-1]都小於L[i]*/   
  70.         }   
  71.         else   
  72.         {   
  73.             A[k++] = R[j++];   
  74.         }   
  75.     }  
  76.  
  77.     while(i < length_l)   
  78.     {   
  79.         A[k++] = L[i++];   
  80.     }  
  81.  
  82.     while(j < length_r)   
  83.     {   
  84.         A[k++] = R[j++];   
  85.     }  
  86.  
  87.     free(L);   
  88.     free(R);   
  89.     return sum;   
  90. }   

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章