数组传参和结构体传参:
- 单个数据:
按值传递,也可以地址传递 - 数组:
function(a)
有两种传递方法,一种是function(int a[])
; 另一种是function(int *a)
。这两种两种方法在函数中对数组参数的修改都会影响到实参本身的值!
C++中数组作为形参进行传递
数组作为形参时,传递的是地址。 - 结构体:
按值传递,也可以地址传递 - 结构体数组:
与数组一样,传递的是地址
结构体:
结构体元素交换
可以直接交换所有元素
贪心法
贪心法:
基本思想:总是做出在当前看来是最好的选择,期待通过局部最优解获得全局最优解
题目:活动安排问题
类似这种题还有个区间覆盖问题,就是说很多个区间,其中有些是相互覆盖着的,要求去除多余的区间,使剩下的区间占用长度最大,实际就是这个题,只是问法变换了而已!
#include <iostream>
// 贪心算法:要求尽可能多的活动,每次选择最早开始最早结束的,用时最少
using namespace std;
struct active {
// 定义活动的结构体
int start;
int finish;
int mark; // 作为此活动有无被执行的标志 /在此处赋初值会有警告
};
// 选择排序排出最早结束的
void finishSort(active num[], int N)
{
int i,j;
for (i=0; i<N-1; i++) {
int min = i;
for (j=i+1; j<N; j++) {
if (num[j].finish < num[min].finish) {
min = j;
}
}
// 结构体元素交换 /
active t = num[i];
num[i] = num[min];
num[min] = t;
}
}
// 活动安排
void Select(active num[], int N)
{
int time = num[0].finish; // 时间指向第一个活动的结束
num[0].mark = 1;
for (int i=1; i<N; i++) {
// 从第一个活动开始比较
if (num[i].start >= time) {
// 此时接着做下一个活动来得及
time = num[i].finish; // 更新时间
num[i].mark = 1; // 标记
}
}
}
int main()
{
active num[100];
// // 输入
// int N;
// cout<<"输入活动个数:"<<endl;
// cin>>N;
// for (int i=0; i<N; i++) {
// cout<<"第"<<i+1<<"个活动:"<<endl<<"起始时间:"<<endl;
// cin>>num[i].start;
// cout<<"结束时间:"<<endl;
// cin>>num[i].finish;
// }
// 默认输入
int N = 11;
int s[11] = {
1,3,0,5,3,5,6,8,8,2,12};
int f[11] = {
4,5,6,7,8,9,10,11,12,13,14};
for (int i=0; i<11; i++) {
num[i].start = s[i];
num[i].finish = f[i];
num[i].mark = 0;
}
// 输出
for (int i=0; i<N; i++) {
cout<<num[i].start<<" "<<num[i].finish<<" "<<num[i].mark<<endl;
}
// 按照最早结束排序///
finishSort(num, 11);
// 输出
for (int i=0; i<N; i++) {
cout<<num[i].start<<" "<<num[i].finish<<" "<<num[i