ecnu1

经典算法

1.汉诺塔问题

​ 河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市;1883年法国数学家Edouard Lucas曾提及这个故事,据说创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。

#include<stdio.h>
void hanio(int n,char A,char B,char C){
   if(n==0){
     return;
   }
   if(n==1){
   //这里相当递归结束的出口,是必须的
     printf("Hanio 从%c->%c\n",A,C);//当只有一块直接放入C盘
   }else{
   //这里是大于一块的,主要用到递归,关键是怎么拆分“原子”
   hanio(n-1,A,C,B);//可以认为这个函数是压入栈内倒数第三步骤、而这个步骤已经完成了将n-1块从A搬到B
   printf("Hanio 从%c->%c\n",A,C);//这里就是将A剩下的一块放入C
   hanio(n-1,B,A,C);//那么现在情况时A中无盘,C中有最大一个盘,B有n-1块盘,这样就回到刚开始n块盘情况,只不过存入n-1块的B相当于原始A盘,而A在此相当原来B盘功能即是辅助盘。
   }
}
int main(){
   //当然目前还是不怎么理解递归,结合栈可能会简单,但是会头晕
   hanio(5,A,B,C);
}

2.冒泡排序

​ 冒泡排序的步骤:两两比较,从数组一端一直比到另一端(假设我们从0下标开始)显然,一次比较完之后得到一个已经归位的值,那么要想得到n个排序好的数,就需要比较n-1次,而它充当外循环,至于内循环次数,可以根据第一次比较找到规律,第一次外循环时一共进行了n-1次比较,那么第二次外循环就是次数n-2次,可以看出规律,第x次外循环就比较n-x次数。

​ 首先看我的盗图

#include<stdio.h>
void bubble(int a[],int length){
    //外循环,可以看出循环次数为length-1
    for(int i=1;i<length;i++){
        //一次外循环比较次数为length-i
        int temp;
        for(int j=0;j<length-i;j++){
            //从index为0开始比较,比较找到数字最大的存入a[j+1],第一次j+1=length-1,这也是为什么i从1开始原因,否则会越界。
            if(a[j]>a[j+1]){
                temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}
int main(){
    int a[]={1,3,2,5,4};
    int length=5;
    bubble(a,length);
}
package three;

public class Parse {
   public void bubble(int []a){
       for (int i = 1; i < a.length; i++) {
           int temp;
           boolean flag=true;//即是每进行一次外循环,查看上次比较中有没有执行,执行过那么肯定为false
           for(int j=0;j<a.length-i;j++){
               if(a[j]>a[j+1]){
                   temp=a[j];
                   a[j]=a[j+1];
                   a[j+1]=temp;  
                   flag=false;
               }    
           }
           if(flag){
               break;
           }
       }
   }
    public static void main(String[] args) {
        int [] a = {1,3,5,4,2};
        Parse p = new Parse();
        p.bubble(a);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i]);
        }
    }
}

3.二分法

​ 非递归方法

#include<stdio.h>
int binarySearch(int a[],int aim,int high){
	int low=0;
	int mid;
	while(low<=high){//注意这里的等于号
	  mid=(low+high)/2;
	  if(a[mid]==aim){
	  	return mid;
	  }else if(a[mid]>aim){
	  	high=mid-1;
	  }else{
	  	low=mid+1;
	  }
	}
	return -1;
} 
int main(){
	int a[]={1,2,3,4,5};
    printf("%d",binarySearch(a,4,5));
}

​ 递归方法

#include<stdio.h>
int  recursionBinarySearch(int a[],int low,int high,int aim){
    if(low>high){return -1;}//用作结束的
	int mid=(low+high)/2;
	if(a[mid]==aim){
		return mid;
	}else if(a[mid]>aim){
		 return recursionBinarySearch(a,low,mid-1,aim);
	}else{
		 return recursionBinarySearch(a,mid+1,high,aim);
	}
}
int main(){
	int a[]={1,2,3,4,5};
    printf("%d",recursionBinarySearch(a,0,4,5));
}

自我介绍

​ 你好,在校期间积极参加各种活动并且努力学习多次获得奖学金,同事积极参加过计算机基础知识等竞赛,期间与同学完成了一个外卖系统的大作业,我主要负责前端页面设计于实现以及数据库的逻辑物理设计等,在此期间开始准备考研,借此机会巩固了计算机基础知识,由于计划不周导致没太重视专业课,致使失利,之后开始着手毕业设计,加深了SMM设计流程的理解。

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦