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