原地算法实现数组反转

       原地算法是一种使用小的,固定数量的额外之空间来转换资料的算法。当算法执行时,输入的资料通常会被要输出的部分覆盖掉。原地算法保证不再额外的开辟内存空间的情况下,实现数据的转换,其空间复杂度为O(1)。

        原地算法常用的策略是使用双指针,比如将一个指针指向数组头部,一个指针指向数组尾部,头指针和尾指针相向而行,最终交汇,这种思路可以解决很多原地算法的问题。

        下面通过原地算法的思想,来实现一个数组的反转。

  一、定义双指针

typedef  unsigned int uint32 ;

typedef struct  TwoPointers
{
    /**左指针*/
   int left;

   /**右指针*/
   int right;

} Tptr;


/**
 * 数组反转
*/
void   reversal_arr(uint32* head,int  len);

/**
 * 展示数组
*/
void   show_arr(uint32* head,int  len);

二、函数实现

/**
 * 数组反转
*/
void   reversal_arr(uint32* head,int  len)
{
    show_arr(head,len);
    
    Tptr  tptr;
    Tptr* p = &tptr;
    p->left = 0;
    p->right = len-1;
     while (p->left < p->right)
     {
        uint32  temp = head[p->left];
        head[p->left] = head[p->right];
        head[p->right] = temp;
        p->left =  p->left +1 ;
        p->right = p->right -1;
     }
     show_arr(head,len);
}

/**
 * 展示数组
*/
void   show_arr(uint32* head,int  len)
{
    if(head == NULL){
        perror("arr  is not  init");
        exit(0);
    }
    printf("----------------\n");
    int  i = 0;
    for(i;i<len;i++)
    {
        printf("%d\t",head[i]);
    }
     printf("\n");
}

三、算法测试

    uint32 arr[] = { 99 , 88 , 77 , 66 , 55 , 44 , 33 ,22 ,11 };
    uint32* head =  &arr[0];
    int len =  sizeof(arr)/sizeof(uint32);
    reversal_arr(head,len);
   

      完美实现反转。 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值