`
tuhaitao
  • 浏览: 378836 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

reverse数组算法

阅读更多

根据不使用中间变量交换两个变量值算法可进一步扩展到数组中:

 

 

#include <stdio.h>

void change(int* a, int* b) {
    *b = *a ^ *b;
    *a = *a ^ *b;
    *b = *a ^ *b;
}

// a[] 为数组
// cnt为数组长度
void reverse_array(int a[], int cnt) {
    int first, last;
    for(first = 0, last = cnt -1; first < last; first++, last--) {
        change(&a[first], &a[last]);
    }
}

void print_array(int a[], int cnt) {
    int i;
    for(i = 0; i < cnt; i++) {
        printf("a[%d]=%d\n", i, a[i]);
    }
}

int main() {
    int array[5] = {1, 2, 3, 4, 5};
    print_array(array, 5);
    reverse_array(array, 5);
    printf("\n");
    print_array(array, 5);
}

 

 

这里需要注意一点,change函数在作交换时,不能对自身做, 比如:

 

 

int x = 3;

change(&x, &x);

printf("x=%d\n", x);
 

 

这将导致x结果为0, 原因在于change函数改变了引用地址中的值:

 

 *b = *a ^ *b;

// 此时如果*a==*b, 那么根据波尔规则,a^a=0 , *b的值被设置为0,

//又因为a于b指向同一块内存,赋值后*a也被设置为0

 *a = *a ^ *b;

// 接着*a = 0 ^ 0 , 那么*a还是0

 *b = *a ^ *b;

// 最后 *b = 0 ^ 0 , 结果自然变为0

 

 

分享到:
评论

相关推荐

    JavaScript中数组的一些算法和技巧总结

    - `reverse()`:反转数组中元素的顺序。 - `sort()`:对数组的元素进行排序,可以自定义比较函数。 - `indexOf()` 和 `lastIndexOf()`:查找指定元素的位置,如果不存在则返回-1。 - `forEach()`:对数组的每个...

    Java数组排序算法.docx

    Java数组排序算法主要涵盖三种经典的排序方法:冒泡排序、直接选择排序以及反转排序。这三种算法都是在处理数组数据时,对数组元素按照特定规则进行重新排列的常见方法。 1. **冒泡排序**: 冒泡排序是一种简单的...

    数组循环移位算法参考.pdf

    数组循环移位算法是一种常见的数据操作,特别是在编程竞赛和算法设计中。该算法的主要目标是在一个包含N个元素的数组中,将所有元素向右移动K位,同时保持时间复杂度为O(N),并限制使用有限的额外空间。在本文中,...

    算法-数组逆序重存放(信息学奥赛一本通-T1105).rar

    4. **使用库函数**:在某些编程语言中,如Python,可以直接使用`reversed()`函数或者`reverse()`方法来实现数组的逆序操作,这是最简洁的方法,但可能不适合竞赛环境,因为通常要求自定义实现。 在信息学奥赛中,...

    用数组实现后缀表达式的算法

    根据给定的信息,本文将详细解释如何在C语言中利用数组来实现后缀表达式的算法。后缀表达式,也称为逆波兰表示法(Reverse Polish Notation, RPN),是一种无需括号即可明确指定运算顺序的数学表达式形式。本文会...

    数组循环移动k位- C++

    在IT领域,数组循环移动是数据结构与算法中一个常见的操作,尤其在处理序列或数组时,这种操作能够帮助我们解决一系列问题,如旋转数组、队列管理等。本篇文章将详细解析“数组循环移动k位-C++”这一主题,包括其...

    C#随机数,C#数组的排序,反转

    总结来说,C#的随机数生成是通过Random类实现的,数组的排序依赖于Array.Sort方法,而反转则借助于Array.Reverse方法。这些基本操作是C#程序员必须掌握的技能,因为它们在日常编程任务中非常常见。通过熟练运用这些...

    数组练习题Subject:数组

    这可以通过使用 Java 中的 Arrays.reverse() 方法或自己编写逆序算法来实现。 5. 数组元素交换 数组元素交换是数组操作的一种常见需求。在 Subject05 中,我们需要输入数组,最大的与第一个元素交换,最小的与最后...

    数组的一些代码

    根据给定文件的信息,我们可以提炼出以下几个重要的知识点: ### 数组的基本概念 #### 定义与声明 数组是一种数据结构,用于...掌握好数组的概念及其常见操作,能够为后续学习更复杂的算法和数据结构打下坚实的基础。

    PHP经典实例--数组

    在IT领域,尤其是在Web开发中,PHP是一种广泛使用的服务器端脚本语言,...无论是处理用户输入、存储数据、还是在复杂的算法中,数组都是核心工具。通过实践和理解这些基本操作,你可以有效地提升编程效率和代码质量。

    java数组练习作业按逆序存放并输出二分法将一个数据插入到该数组二维数组对角线之和.pdf

    二分法是一种常用的算法,用于在已排好序的数组中插入一个新的元素,使插入后的数组仍然保持有序。下面是一个使用二分法插入数据到数组的示例代码: ```java int[] arr = {1, 2, 3, 4, 5}; int target = 3; int ...

    调用算法简化数组编程_washr3x_treatedsw5_algorithm_

    本篇将深入探讨如何利用`&lt;algorithm&gt;`库简化数组编程,帮助初学者更好地理解和运用这些高效算法。 首先,`&lt;algorithm&gt;`库是C++标准模板库(STL)的一部分,它包含了大量用于处理容器(如数组和向量)的函数模板。...

    C#数组的详细的讲解

    C#中的数组是一种存储同一类型数据的集合,它提供了一种高效且有序的方式来管理大量数据。数组分为一维数组、二维数组...理解并熟练运用数组对于C#程序员来说至关重要,因为它在数据处理和算法实现中扮演着核心角色。

    翻转字符串数组

    这种操作在数据处理、算法实现或者某些特定功能的软件开发中可能会用到。 在C++中,我们可以使用多种方法来实现这个功能。下面将详细介绍三种可能的实现方式,对应于压缩包中的三个文件:`reverse2.cpp`, `reverse3...

    数组循环移位问题的解法的探究

    特别是在涉及到数组元素的移动时,如何高效地进行数组元素的移位操作成为了许多算法研究的重点之一。本文将深入探讨数组循环移位问题的解决方法,并通过对不同解决方案的分析,寻求最优解。 #### 数组循环移位的...

    Java数组倒置.rar

    对于存储对象的数组,可以先将其转换为ArrayList,然后利用Collections的reverse()方法进行倒置,最后再转换回数组。这种方法比较方便,但会涉及到额外的内存分配。 ```java import java.util.ArrayList; ...

    将数组逆序排列,C语言实现。

    在编程领域,数组逆序排列是一个常见的操作,尤其在数据处理和算法实现中。本话题主要探讨如何使用C语言来实现这一功能。C语言是一种强大的、低级别的编程语言,它提供了对内存的直接访问和控制,因此对于数组操作...

    01-E-4 数组倒置1

    总结来说,数组倒置是一个基本的数组操作,在数据结构和算法中经常遇到。无论是通过递归还是迭代,都可以有效地实现数组元素的反转。在选择实现方式时,需要考虑问题规模、性能需求以及代码的可读性和维护性。

    蓝桥杯c++-蓝桥杯竞赛练习之算法提高题递归倒置字符数组.zip

    在C++编程语言中,"递归倒置字符数组"是一个常见的算法问题,它涉及到对字符串的处理和递归的概念。在蓝桥杯竞赛中,这样的题目旨在考察参赛者的逻辑思维能力和对C++语言基础的掌握程度。让我们深入探讨这个问题。 ...

Global site tag (gtag.js) - Google Analytics