数组rotate

将数组进行循环左移位的代码实现,杂技算法,确实很杂技:

#include <stdio.h>
#include <stdlib.h>

#define swap(a,b) {int temp = (a); (a) = (b); (b) = temp;}

void rotate(int a[], int n, int m)
{
    int i, len, p = 0, r = n - 1;
    while(1)
    {
        len = 1 + r - p;
        if(2 * m == len)
        {
            for(i = 0; i < m; ++i)
            {
                swap(a[p + i], a[p + m + i]);
            }
            return;
        }
        else if(2 * m < len)
        {
            for(i = 0; i < m; ++i)
            {
                swap(a[p + i], a[1 + r - m + i]);
            }
            r -= m;
        }
        else
        {
            for(i = 0; i < len - m; ++i)
            {
                swap(a[p + i], a[p + m + i]);
            }
            p += len - m, m = 2 * m - len;
        }
    }
}

int main()
{
    int A[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}, i;
    rotate(A, 10, 3);
    for(i = 0; i < 10; ++i)
    {
        printf("%d", A[i]);
    }
    printf("\n");
    return 0;
}

posted @ 2012-12-18 03:16  knull  Views(253)  Comments(0)    收藏  举报