pastebin

Paste Search Dynamic
Recent pastes
swap
  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=1; 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. }
Parsed in 0.020 seconds