ckook

导航

 

问题:编写反转字符串的程序,要求优化速度、优化空间。

此处以整型数组为例,代码如下:

/*用位运算快速交换两个数,注意必须确保两个数不是同一实例*/
#define swap(a, b) {*(a) ^= *(b); *(b) ^= *(a); *(a) ^= *(b);}

/*翻转数组*/
void reverse(int arr[], int len)
{
    int halflen = len / 2;
    int iend = len - 1;
    
    for(int i=0; i < halflen; i++) /*只需遍历一半*/
        swap(&arr[i], &arr[iend-i]); /*利用下标的特点进行交换*/
}

/*第二种版本*/
void reverse2(int arr[], int len)
{
    int i = 0, j = len - 1;
    while(i < j) {
        swap(&arr[i], &arr[j]);
        i++; j--;
    }
}

注意,以上两个版本是不一样的。for循环一般用于可以事先确定循环范围的场合,这样带来了三个好处:一是有利于数据高速缓存,二是代码更短指令可预测,三是有利于并行;而while一般不事先界定范围,故无此特点。所以以上第一个版本从程序优化上来说应该更快一些。

posted on 2012-05-30 11:22  ckook  阅读(354)  评论(0)    收藏  举报