#include<stdio.h>
#include<stdlib.h>
typedef struct job{
int order; //作业序号
int time; //作业所需时间
}job;
//比较函数
//int Compare(const void* _a, const void* _b) {
// job* a = (job*)_a;
// job* b = (job*)_b;
// return b->time - a->time; //从大到小
//}
int Compare(const void* x, const void* y) { //从大到小
return (((job*)y)->time - ((job*)x)->time); //void*表示空类型的指针(泛型指针),可以接收来自任何类型的元素地址,
} //对于指针的比较,我们必须要将指针强制转化为相应的数据类型,比如排列结构体型数据,就将两指针强制转为 (struct*);
void MultiMachine(job t[], int n, int d[], int m, int p[]){
int S[m][n]; //三台机器七个作业
int rear[m]; //S[i]为第 i台机器的处理作业队列,rear[i]为队尾下标
int i, j, k;
for(i=0;i<m;i++){ //安排前 m个作业
S[i][0]=p[i];
rear[i]=0;
d[i]=t[i].time;
}
for(i=m;i<n;i++){
for(j=0,k=1;k<m;k++){
if(d[k]<d[j]) //查找空闲时间最少的机器
j=k;
}
rear[j]++; //新增作业,对位下标后移
S[j][rear[j]]=p[i]; //第 j台机器的下一个作业为 i
d[j]=d[j]+t[i].time;
}
for(i=0;i<m;i++){ //输出每个机器处理的作业
printf("机器M %d 作业 :", i+1);
for(j=0;j<=rear[i];j++)
printf(" %d",S[i][j]+1);
printf(" 加工时间 : %d", d[i]);
printf("\n");
}
}
int main(){
int m,n;
printf("请输入机器数量和作业数量 : ");
scanf("%d %d", &m, &n);
job t[n]; //结构体数组
int p[n];
int d[m];
int i, j, k;
for(i=0;i<m;i++){
d[i]=0;
}
for(j=0;j<n;j++){
t[j].order=j;
printf("t[%d]:",j+1);
scanf("%d", &t[j].time);
}
qsort(t, n, sizeof(job), Compare); //快排函数
for(j=0;j<n;j++){
p[j]=t[j].order; //排序后各位置对应作业序号
}
printf("\n");
MultiMachine(t, n, d, m, p);
return 0;
}
将数组t[n]进行排序,其时间性能为O(nlogn),完成前m个作业的分配,其时间性能为O(m),完成后n-m个作业的分配,操作“数组d[m]中最小值对应的下标”如果采用蛮力法查找,其时间性能为O(m),则算法的时间性能为 : T(n)=m+(n-m)*m,通常情况下m<<n,算法时间复杂度为O(m*n)。