3个基本算法的实现技巧

  问题1:如何不使用中间变量来实现两个整形变量的交换。解决这个问题是思路很多,首先可以用加减法,即

1 void swp(int *x,int *y)
2 {
3     *x=*x+*y;
4     *y=*x-*y;
5     *x=*x-*y;
6 }

其实任何满足互逆运算的运算都可以用来实现两个整形变量的交换。异或运算和乘除运算都可以实现两个整形变量的交换。

异或运算方法如下:

a=a^ b;
b=a^ b;
a=a^ b;

乘除运算方法如下:

a=a*b;
b=a/b;
a=a/b;

由于a,b不能为0,所以有一定的适用范围。

当然也可以这样:

a=(a+b)/2;
b=(a-b)/2;
a=a-b;
b=a+b;

不过看似合理的公式却是实用性不大,因为不同的语言,不同的类型会出现意想不到的情况。

问题2:快速排序的实现

标准的快速排序可以这样写:

 1 int partition(int src[],int lower,int upper)
 2 {
 3     int choosed=src[lower];
 4     while(lower<upper)
 5     {
 6         while(lower<upper&&choosed<=src[upper]) upper--;
 7         if(lower<upper) 
 8         {
 9             int tmp=src[lower];
10             src[lower]=src[upper];
11             src[upper]=tmp;
12         }
13         while(lower<upper&&choosed>=src[lower]) lower++;
14         if(lower<upper) 
15         {
16             int temp=src[lower];
17             src[lower]=src[upper];
18             src[upper]=temp;
19         }
20     }
21     return lower;
22 }
23 void quick_sort(int src[],int lower,int upper)
24 {
25     if(lower<upper)
26     {
27         int mid=partition(src,lower,upper);
28         quick_sort(src,lower,mid-1);
29         quick_sort(src,mid+1,upper);
30     }
31 }

但是实现低位和高位交换的写法有点繁复可以优化为:

 1 int partition(int src[],int lower,int upper)
 2 {
 3     int choosed=src[lower];
 4     while(lower<upper)
 5     {
 6         while(lower<upper&&choosed<=src[upper]) upper--;
 7         if(lower<upper) src[lower]=src[upper];
 8         while(lower<upper&&choosed>=src[lower]) lower++;
 9         if(lower<upper) src[upper]=src[lower];
10 
11         src[lower]=choosed;
12     }
13     return lower;
14 }

问题3:fibonacci数列的实现:

1 int fibonacci(int n)
2 {
3         if (n == 0 || n == 1)
4                 return 1;
5         else
6                 return fibonacci(n-1) + fibonacci(n-2);
7 }

递归方法思路清晰,但是由于递归的效率不高,在可以不用递归的地方尽量用非递归方法。

下面为非递归方法:

 1 int Fibonacci(int n)
 2 {
 3     if(n==1 || n==0) return 1;
 4     int f1=1, f2=1, sum=0;
 5     for(int i=2; i<=n; ++i)
 6     {
 7        sum = f1 + f2;
 8        f1 = f2;
 9        f2 = sum;
10     }
11     return sum;
12 }

这里利用sum变量不断迭代计算累加结果,其实利用两个变量就可以实现:

 1 int fibonacci(int n)
 2 {    
 3     if(n==1||n==0) return 1;
 4     int y=1;int x=1;
 5     for(int i=1;i<n;i++)
 6     {
 7         y=x+y;
 8         x=y-x;
 9     }
10     return y;
11 }

   当然累加实现写成一行效果也一样:

1 x,y=y,x+y
2 return x

  

原文地址:https://www.cnblogs.com/lkprof/p/3160236.html