этот алгоритм находит наиболее перекрывающиеся действия (полосы) в определенных интервалах, которые начинаются в arrl и заканчиваются в depr. Я использовал быструю сортировку для сложности времени O (nlogn) и затем цикл while с O (n) для подсчета числаконфликтующие действия в этих интервалах 1. Так это как O (nlogn) + O (n) сложность времени?2.Могу ли я сделать это еще быстрее в O (N)?3. Наконец, теоретически возможно ли использовать Timsort для O (n) временной сложности?
Код, написанный на C, предназначен для 15 действий, но, скажем, он обобщенный и с несортированными arrl и depr
РЕДАКТИРОВАТЬ: Результатом является большинство действий в течение 1 часа
void findMaxBands(int n,int arr1[n],int depr[n]);
void quickSort(int a[],int l,int h);
int partition(int a[],int l,int h);
int main(){
int arrl[15] = {18,18,19,19,19,19,20,20,20,20,21,22,22,22,23};
int depr[15] = {19,21,20,21,22,23,21,22,22,23,23,23,24,24,24};
int n = 15;
findMaxBands(n,arrl,depr);
return 0;
}
void findMaxBands(int n,int arrl[n],int depr[n]){
quickSort(arrl,0,15);
quickSort(depr,0,15);
int guestsIn = 1,maxGuests = 1,time = arrl[0];
int i = 1, j = 0;
while (i < n && j < n){
if (arrl[i] <= depr[j]){
guestsIn++;
if (guestsIn > maxGuests){
maxGuests = guestsIn;
time = arrl[i];
}
i++;
}
else{
guestsIn--;
j++;
}
}
printf("Maximum Number of Bands : %d at time %d-%d",maxGuests,time-1,time);
}
void quickSort(int a[],int l,int h){
int j;
if(l<h){
j=partition(a,l,h);
quickSort(a,l,j-1);
quickSort(a,j+1,h);
}
}
int partition(int a[],int l,int h){
int v,i,j,temp;
v=a[l];
i=l;
j=h+1;
do{
do{
i++;
}while(a[i]<v&&i<=h);
do{
j--;
}while(v<a[j]);
if(i<j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
}
}while(i<j);
a[l]=a[j];
a[j]=v;
return(j);
}