2016-03-23 56 views
1

陣列被預先排序,使得算法θ(nlogn)[排序+找到最小距離],與強力θ(n2)相比。這兩個代碼都執行相同的工作,但第一個顯示超出了時間限制。我不知道錯誤是什麼。代碼中的任何錯誤?查找n個數字的數組中最接近的兩個數字之間的距離。 (Presorted Arrays)

代碼while循環(時間超過限制)

使用循環(效果很好)
#include <stdio.h> 

void mindistance(int a[],int n) 
{ 
    int i=1,arraymin=999,currentmin,current=a[0]; 

    while(i<n) 
    { 
     if(a[i]==current) 
      i++; 
     else 
     { 
      currentmin=a[i]-a[i-1]; 
      if(currentmin<arraymin) 
      { 
       arraymin=currentmin; 
       current=a[i]; 
       i++; 
      } 

     } 
    } 
    printf("%d",arraymin); 
} 


int main(void) 
{ 

    int a[]={4,34,56,77,99,424,754}; 
    mindistance(a,7); 

    return 0; 
} 

代碼


#include <stdio.h> 

void mindistance(int a[],int n) 
{ 
    int i,arraymin=999,currentmin,current=a[0],x,y; 

    for(i=1;i<n;i++) 
    { 
     if(a[i]==current) 
      continue; 
     else 
     { 
      currentmin=a[i]-a[i-1]; 
      if(currentmin<arraymin) 
      { 
       arraymin=currentmin; 
       current=a[i]; 

      } 

     } 
    } 
    printf("%d",arraymin); 
} 


int main(void) 
{ 

    int a[]={4,34,56,77,99,424,754}; 
    mindistance(a,7); 

    return 0; 
} 
+1

'i ++'應該總是會發生。所以,在while循環中,要麼作爲循環中的第一件事,要麼作爲循環中的最後一件事。不要在if語句中這樣做。無論如何,如果你堅持在測試中這樣做,還會有其他缺失的'if(currentmin

+0

這確實奏效。 if-else子句之後的常規i ++語句。但是爲什麼它不能更早地用單獨的i ++增量工作? –

回答

1

循環不相同。在for循環中,我在每次迭代中增加,而在while循環中,我僅在某些情況下增加。一個相同的while循環將是:

while(i<n) 
{ 
    if(a[i]==current) 
     i++; 
    else 
    { 
     currentmin=a[i]-a[i-1]; 
     if(currentmin<arraymin) 
     { 
      arraymin=currentmin; 
      current=a[i]; 
     } 
     i++; 
    } 
} 
+0

但我不明白爲什麼我們不能在if子句中增加i?它就像其他變量一樣嗎?還是應該只用匹配的if-else子句增加? –

+0

你可以。但是在你寫的while代碼中,你不會在你輸入else子句的迭代中增加i,但是currentmin> = arraymin(因此你沒有輸入第二個if子句而我沒有增加)。在你寫的for循環中,我在每一次迭代中增加(即使currentmin> = arraymin)。 –

+0

是的確注意到了..謝謝。 –

0

我相信你陷入無限循環,因爲你不是' t每次迭代設置電流值。

+0

使用if-else子句後的常規i ++語句。但是爲什麼它不能更早地用單獨的i ++增量工作? –

相關問題