#include<stdio.h>
#include<stdlib.h>
typedef struct acti{
int order; //定义结构体,后续排序后便于记录序号
int begin;
int end;
}acti;
//比较函数
int Compare(const void* x, const void* y) {
return (((acti*)x)->end - ((acti*)y)->end);
}
int ActiveManage(acti A[], int B[], int n, int p[]){
int i,j;
int rear;
j=0;
B[0]=p[0];
rear=0;
for(i=1;i<n;i++){
if(A[i].begin>=A[j].end){
rear++; B[rear]=p[i]; //将活动 p[i]插入队列B[];
j=i;
}
}
return rear;
}
int main(){
int n;
printf("请输入活动数目 : ");
scanf("%d",&n);
acti A[n]; //结构体数组,存储活动
int B[n]; //队列存储活动安排信息,下标从0开始;
int p[n];
int i,j;
for(i=0;i<n;i++){
A[i].order=i;
printf("第%d个活动开始和结束时间 : ",i+1);
scanf("%d %d", &A[i].begin, &A[i].end);
}
//将活动按结束时间非降序排列
qsort(A, n, sizeof(acti), Compare); //快排函数
for(j=0;j<n;j++){
p[j]=A[j].order; //p[]存储排序后各位置对应作业序号
}
int k;
k=ActiveManage(A, B, n, p);
printf("选定活动集合为 :{");
for(i=0;i<=k;i++){
printf(" %d",B[i]+1);
}
printf("}");
}
算法分析
将各个活动按结束时间从小到大排序,其时间代价为O(nlogn);依次考察每一个活动,其时间代价为O(n),因此,算法的时间复杂度为O(nlogn)。