fork(2) download
  1. #include <stdio.h>
  2.  
  3. typedef int value_t;
  4.  
  5. void SWAP(value_t* a, value_t* b) {
  6. value_t t = *a;
  7. *a = *b; *b = t;
  8. }
  9.  
  10. int next_index(int n)
  11. {
  12. while (n & 1) { n = n >> 1; }
  13. return n >> 1;
  14. }
  15.  
  16. void interleave(value_t A[], int n)
  17. {
  18. int i, j, k;
  19. int m = n/2;
  20. value_t* L = A;
  21. value_t* R = A+m;
  22.  
  23. // Place 1st half
  24. for (i=0; i < m; i++) {
  25. j = next_index(i);
  26. SWAP( L+i, R+j);
  27. }
  28.  
  29. //unscramble step
  30. for (j=0;j < m/2 -1; j++) {
  31. k = next_index(m/2 + j);
  32. while (k < j) {
  33. k = next_index(m/2 + k);
  34. }
  35. SWAP( R+j, R+k);
  36. }
  37. if (n-m > 1) {
  38. int b = (m&1) ? 1 : 0;
  39. interleave(R+b, n-m-b);
  40. }
  41. }
  42.  
  43. value_t A[100];
  44. int main(void) {
  45. int i;
  46. int count = 20;
  47. for (i=0;i<count; i++) {
  48. A[i]=i;
  49. }
  50. interleave(A, count);
  51. for (i=0;i<count; i++) {
  52. printf("% 2d",A[i]);
  53. }
  54. printf("\n");
  55. }
Success #stdin #stdout 0s 9424KB
stdin
Standard input is empty
stdout
 10 0 11 1 12 2 13 3 14 4 15 5 16 6 17 7 18 8 19 9