算法设计与分析01

107 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

1.n!的递归算法实现

题目分析

递归:程序自己调用自己

n!=n(n-1)(n-2)(n-3)*1
代码实现:C++

#include<iostream>
using namespace std;
int Factorial(int n)
{
	if(n==1)return 1;
	else return n*Factorial(n-1);
}
int main()
{
	int n;
	cin>>n;
	cout<<Factorial(n)<<endl;
	return 0;
} 

执行结果:
image.png
Java代码:

package Practise915;
import java.util.Scanner;

public class Test {
		public static int Factor(int n) {
			if(n==1)return 1;
			else return n*Factor(n-1);
		}
		public static void main(String[] args)
		{
			System.out.println("请输入你要求阶乘的数据为:");
			Scanner scanner=new Scanner(System.in);
			int n=scanner.nextInt();
			System.out.println(Factor(n));
		}
	
}

运行结果:
image.png

2.Fibonacci数列

代码实现:C++

#include<iostream>
using namespace std;
int Fibonacci(int n)
{
	if(n<=2)return 1;
	else return Fibonacci(n-1)+Fibonacci(n-2);
}
int main()
{
	int n;
	cin>>n;
	cout<<Fibonacci(n)<<endl;
	return 0;
} 

运行结果:
image.png

Java代码:

package Practise915;

import java.util.Scanner;

public class Fib {
	public static int Fibonna(int n)
	{
		if(n<=2)return 1;
		else return Fibonna(n-1)+Fibonna(n-2);
	}
	public static void main(String[] args)
	{
		Scanner scanner=new Scanner(System.in);
		System.out.println("请输入您要找的位置:");
		int n=scanner.nextInt();
		System.out.println(Fibonna(n));
	}
}

运行结果:
image.png

3.二分查找

代码实现:C++

#include<iostream>
using namespace std;
int Search(int a[],int n,int x)
{
	int left=0,right=n-1;
	while(left<=right)
	{
		int middle=(left+right)/2;
		if(a[middle]==x)return middle;
		if(a[middle]>x)right=middle-1;
		else left=middle+1;
	}
	return -1;
}
int main()
{
	int n,x;
	cin>>n>>x;
	int array[n];
	for(int i=0;i<n;i++)
		cin>>array[i];
	cout<<Search(array,n,x)<<endl;
	
	return 0;
} 

运行结果:
image.png

image.png

java代码:

package Practise915;

import java.util.Scanner;

public class BinarySearch {

	public static int BinSearch(int array[],int count,int x)
	{
		int left=0,right=count-1;
		while(left<=right)
		{
			int middle=(left+right)/2;
			if(x==array[middle])return middle;
			else if(x>array[middle])left=middle+1;
			else right=middle-1;
		}
		return -1;
		
	}
	public static void main(String[] args) 
	{
		Scanner scanner=new Scanner(System.in);
		int array[]= {1,4,5,6,8,9,11,12,14,16};
		int len=array.length;
		System.out.println("请输入你要查找的数据:");
		int number=scanner.nextInt();
		System.out.println(BinSearch(array, len, number));
	}

}

运行结果:
image.png

4.二分搜索

代码实现:C++

#include<iostream>
using namespace std;
int Search(int a[],int n,int x)
{
	int i=0,j=0;
	int left=0,right=n-1;
	int flag=-1;
	int middle;
	while(left<=right)
	{
		middle=(left+right)/2;
		if(a[middle]==x)flag=middle;
		if(a[middle]>x)right=middle-1;
		else left=middle+1;
	}
	if(flag==-1)
	{
		i=right;
		j=left;
	}
	else
	{
		j=i=middle;
	}
	cout<<"i的值为:"<<i<<" j的值为:"<<j<<endl;
}
int main()
{
	int n,x;
	cin>>n>>x;
	int array[n];
	for(int i=0;i<n;i++)
		cin>>array[i];
	Search(array,n,x);	
	return 0;
} 

运行结果:
image.png

image.png
Java代码实现:

package Practise915;

import java.util.Scanner;

public class BinarySearch001 {

	public static int BinarySearch(int array[],int count,int x)
	{
		int left=0,right=count-1;
		int i=0,j=0;
		int middle=0;
		int flags=-1;
		while(left<=right)
		{
			middle=(left+right)/2;
			if(array[middle]==x)
			{
				i=middle;
				j=i;
				flags=middle;
				System.out.println("i的值为:"+i+" j的值为:"+j);
				break;
			}
			else if(x>array[middle])left=middle+1;
			else right=middle-1;
		}
		if(flags==-1)
		{
			i=right;
			j=left;
			System.out.println("i的值为:"+i+" j的值为:"+j);
		}
		return -1;
	}
	public static void main(String[] args) 
	{
		int arr[]= {1,3,4,6,9};
		int len=arr.length;
		System.out.println("请输入要查找的数据:");
		Scanner scanner=new Scanner(System.in);
		int number=scanner.nextInt();
		int result=BinarySearch(arr, len, number);
		
	}	

}

运行结果:
image.png

5.查找中位数

代码实现:C++

#include <iostream>
using namespace std;
int SearchMiddleNumber(int x[],int y[],int x_left,int x_right,int y_left,int y_right) 
{
	if (x_left == x_right)return x[x_left];
	else if (y_left == y_right)return y[y_left];
	int x_middle, y_middle;
	x_middle = (x_left + x_right) / 2;
	y_middle = (y_left + y_right) / 2;
	if (x[x_middle] > y[y_middle])
	{
		x_right = x_middle;
		y_left = y_middle;
	}
	else if (x[x_middle] < y[y_middle])
	{
		x_left = x_middle;
		y_right = y_middle;
	}
	else return x[x_middle];
	SearchMiddleNumber(x, y, x_left, x_right, y_left, y_right);
}



int main()
{
	int x[10] = { 1,3,5,7,9,11,13,15,17,19 };
	int y[10] = { 2,4,6,8,10,12,14,16,18,20 };
	int length_x = sizeof(x) / sizeof(x[0]);
	int length_y = sizeof(y) / sizeof(y[0]);
	int x_low=0, y_low=0 ;
	int midNum = SearchMiddleNumber(x, y, x_low, length_x, y_low, length_y);
	cout << midNum << endl;

	return 0;
}

运行结果:
image.png
Java

package Practise915;

public class FindMiddleNumber {

	public static int search(int[] a, int[] b, int la, int ra, int lb, int rb) {
	        int ma = (la + ra) / 2;
	        int mb = (lb + rb + 1) / 2;
	        if (la == ra) {
	            return (lb == rb) ? Math.min(a[la], b[lb]) : Math.min(a[la], b[rb]);
	        } else if (lb == rb) {
	            return Math.min(b[lb], a[ra]);
	        }
	        if (la == ra-1 && lb == rb-1) {
	            mb = (lb + rb) / 2;
	        }
	        return a[ma] == b[mb] ? a[ma] : (a[ma] > b[mb] ? search(a, b, la, ma ,mb, rb) : search(a, b, ma, ra, lb, mb));
    }
	public static void main(String[] args) 
	{
	       int x[] = { 1,3,5,7,9,11,13,15,17,19 };
	       int y[] = { 2,4,6,8,10,12,14,16,18,20 };
	       int la=0,lb=0;
	       int ra=x.length;
	       int rb=y.length;
	       int midNumber=search(x, y, la, ra, lb, rb);
	       System.out.println(midNumber);
       
	}

}


}

运行结果:
image.png

总结:

分治法的精髓:

分–将问题分解为规模更小的子问题;
治–将这些规模更小的子问题逐个击破;
合–将已解决的子问题合并,最终得出“母”问题的解;

收获:

实践是检验真理的唯一标准,只有动手体验,才会感受到编程的魅力,有bug并不可怕,可怕的是停滞不前。分治法-分而治之,将大问题化解为小问题,将小问题解决,进而解决大问题。