经典算法
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设计流程的理解。