赞
踩
- #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)。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。