- 递归
- 选择法排序
#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; }
全排列
-
2、分治法#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; }
- 快速排序
-
#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;
}