基础算法例题(递归、分治......)

  1. 递归
  • 选择法排序
    #include<iostream>
    #include<algorithm>
    using namespace std;
    void selectsort(int a[], int n, int i)
    {
    	if (i == n - 1) return;
    	else
    	{
    		int k = i;
    		for (int j = i + 1; j < n; j++)
    		{
    			if (a[j] < a[k])
    				k = j;
    		}
    		if (k != i)
    			swap(a[i], a[k]);
    		selectsort(a, n, i + 1);
    	}
    }
    int main()
    {
    	int n = 10;
    	int a[10] = { 2,5,1,7,10,6,9,4,3,8 };
    	selectsort(a, n, 0);
    	for (int i = 0; i < n; i++)
    		printf("%d ", a[i]);
    	system("pause");
    	return 0;
    }

    全排列

  • #include<iostream>
    #include<algorithm>
    using namespace std;
    void Bubblesort(int a[], int n, int i)
    {
    	int j;
    	bool flag;
    	if (i == n - 1) return;
    	else
    	{
    		flag = false;
    		for(j=n-1;j>i;j--)
    			if (a[j] > a[j - 1])
    			{
    				swap(a[j], a[j - 1]);
    				flag = true;
    			}
    		if (flag == false) return;
    		else Bubblesort(a, n, i + 1);
    	}
    }
    int main()
    {
    	int n = 10;
    	int a[10] = { 2,5,1,7,10,6,9,4,3,8 };
    	Bubblesort(a, n, 0);
    	for (int i = 0; i < n; i++)
    		cout << a[i] << " ";
    	cout << endl;
    	system("pause");
    	return 0;
    }
    2、分治法
  • 快速排序
  • #include<iostream>
    using namespace std;
    const int N = 10000;
    int n;
    int a[N];
    void quicksort(int l, int r)
    {
    	if (l >= r) return;
    	int x = a[(l + r) / 2];
    	int i = l - 1, j = r + 1;
    	while (i < j)
    	{
    		do i++; while (a[i] < x);
    		do j--; while (a[j] > x);
    		if (i < j) swap(a[i], a[j]);
    	}
    	quicksort(l, j);
    	quicksort(j + 1, r);
    }
    int main()
    {
    	cin >> n;
    	for (int i = 0; i < n; i++) cin >> a[i];
    	//快排
    	quicksort(0, n-1);
    	F	or (int i = 0; i < n; i++) cout << a[i] << " ";
    	cout << endl;
    	system("pause");
    	return 0;
    }

     

  • 查找最大值和次大值问题

#include<iostream>
#include<algorithm>
#include<Windows.h>
using namespace std;
void Comp(int arr[], int l, int r, int &max1, int &max2)
{
	int mid;
	int left_max1, left_max2, right_max1, righr_max2;
	if (r - l < 0)
		return;
	if (r - l == 0)
	{
		max1 = arr[r];
		max2 = -1.79e308;
}
	else if (r - l == 1)
	{
		max1 = max(arr[l], arr[r]);
		max2 = min(arr[l], arr[r]);
	}
	else
	{
		mid = (r + l) / 2;
		Comp(arr, 0, mid, left_max1, left_max2);
		Comp(arr, mid + 1, r, right_max1, righr_max2);
		if (left_max1 > right_max1)
		{
			max1 = left_max1;
			max2 = max(left_max2, right_max1);
		}
		else
		{
			max1 = right_max1;
			max2 = max(left_max1, righr_max2);
		}
	}
}

int main()
{
	int n, temp;
	int max1, max2;
	scanf("%d", &n);
	int *a = (int*)malloc(sizeof(double)*n);
	//动态创建实数序列
	for (temp = 0; temp < n; temp++)
	{
		scanf("%d", &a[temp]);
	}
	printf("\n");
	Comp(a, 0, n - 1, max1, max2);
	printf("最大值为: %d \n次大值为: %d \n", max1, max2);
	system("pause");
	return 0;
}

3、动态规划

① 使用动态规划法,求 fibonacci 数列

#include<iostream>
using namespace std;
int main()
{
	int a, b, n;
	cin >> n;
	a = 1;
	b = 1;
	for (int i = 3; i <= n; i += 2)
	{
		a += b;
		b += a;
	}
	if (n % 2 == 0)
		cout << b << endl;
	else
		cout << a << endl;
	system("pause");
	return 0;
} 

②求解整数拆分问题

#include<iostream>
using namespace std;
const int N = 1000;
int f[N][N];//表示数i分解成最大数为j的种数
int main()
{
	int n, k;
	cin >> n >> k;
	for (int i = 1; i <= n; i++)
	{
		for (int j = 1; j <= k; j++)
		{
			if (i == 1 || j == 1)
				f[i][j] = 1;
			else if (i < j)
				f[i][j] = f[i][i];
			else if (i == j)
				f[i][j] = f[i][j - 1] + 1;
			else
				f[i][j] = f[i - j][j] + f[i][j - 1];
		}
	}
	cout << f[n][k] << endl;
	system("pause");
	return 0;
}

③求解0/1背包问题

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10000;
int n,V;
int v[N], w[N], f[N];
int main()
{
	cin >> n >> V;
	for (int i = 1; i <= n; i++) cin >> v[i] >> w[i];
	for(int i=1;i<=n;i++)
		for (int j=V;j >= v[i]; j--)
		{
			f[j] = max(f[j], f[j - v[i]] + w[i]);
		}
	cout << f[V] << endl;
	return 0;
}

④ 最长公共子序列

#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10000;
int n;
int a[N], f[N];
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++)
	{
		f[i] = 1;
		for (int j = 1; j < i; j++)
		{
			if (a[j	] < a[i])
				f[i] = max(f[i], f[j] + 1);
		}
	}
	int res = 0;
	for (int i = 1; i <= n; i++)
		res = max(res, f[i]);
	cout << res << endl;
	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值