• 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

      

  • 相关阅读:
    实验四 代码评审
    实验三、UML 建模工具的安装与使用
    结对编程 第二阶段
    结对编程第一阶段
    实验一 GIT代码版本管理
    实验五 单元测试
    实验四 代码评审
    实验三 UML 建模工具的安装与使用
    结对编程阶段二
    结对编程第一阶段
  • 原文地址:https://www.cnblogs.com/lkprof/p/3160236.html
Copyright © 2020-2023  润新知