2013-08-08 14 views
5

Próbowałem następującego kodu, aby znaleźć minimalny element w cyklicznej posortowanej tablicy. Ale zawiedzie, gdy niski = 1 i wysoki = 2, ponieważ środek jest zawsze 1, a [środkowy] = a [1] jest zawsze większy niż a [wysoki].znajdowanie minimalnego elementu w cyklicznej posortowanej tablicy

Próbuję użyć wyszukiwania binarnego tutaj, aby znaleźć rozwiązanie.

//finding the minim element in the cyclic sorted array 
int arrC[]={10,13,1,3,4,5,8}; 
int low=0,high =6; 
int mid=0,reset =1; 
while (low < high) 
{ 
    mid = (low+ high)/2; 
    if (arrC[mid]>arrC[high]) 
    { 
     low = mid; 
    } 
    else if (arrC[mid] < arrC[high]) 
    { 
     high = mid; 

    } 
} 
printf("minimum element is %d",arrC[mid+1]); 
+0

Masz na myśli obracaną tablicę? – aaronman

+0

Tak @ aaronman. Jest to obrócona posortowana tablica. – krrishna

+0

Możesz wydrukować 'arrC [mid + 1]', ale twój minimalny mid to 0 ... Twój kod nie powiedzie się w najprostszym przypadku, gdy pierwszy element jest najmniejszy, także gdy tablica ma pojedynczy element. –

Odpowiedz

2

Użyć zwykłej przeszukiwanie binarne, ale jeśli arrC[high] < arrC[low] traktować arrC[high] jako nieskończoności do odpowiedzialności za zawinięcia. Aby to zrobić wystarczy zmienić linię:

if (arrC[mid]>arrC[high]) 

Do:

if (arrC[high] < arrC[low] || arrC[mid] > arrC[high]) 
3

Są 2 problemy z kodem

  • Jak wskazano przez Paulpro ... traktują ARRC [Wysoki] jak nieskończoność ..
  • Poza tym proponuję użyć także

mid = low + (high-low)/2;

Nie używaj (low+high)/2. Może to spowodować, że suma przekroczy limit liczby całkowitej i spowoduje wynik ujemny. Jeszcze jeden powód, dla którego twój kod może zawieść.

-2
#include <stdio.h> 

int main(void){ 
//finding the minim element in the cyclic sorted array 
    int arrC[]={10,13,1,3,4,5,8}; 
    int low=0, high = sizeof(arrC)/sizeof(*arrC)-1; 
    int range; 
    if(arrC[low]>=arrC[high]){ 
     while (range = (high - low)/2){// range = range/2; 
      if(arrC[high - range] <= arrC[high]){ 
       high -= range; 
      } else { 
       low = high - range; 
       continue; 
      } 
      if(arrC[low] <= arrC[low + range]){ 
       low += range; 
      } else { 
       high = low + range; 
      } 
     } 
     if(high == low + 1){ 
      low = high; 
     } 
    } 
    printf("minimum element is %d",arrC[low]);//1 
    return 0; 
} 

Uwaga: To nie jest możliwe, aby zmniejszyć o połowę zakres wyszukiwania po prostu, gdy ta sama wartość jest wliczone w uporządkowanych danych w przypadku, ponieważ nie jest możliwe, aby łatwo określić kierunek być przeszukane. Ale jest to możliwe, jeśli ta sama wartość nie jest uwzględniona.

+1

losowy kod bez objaśnień ... Mam ochotę po prostu zgodzić się z tym .. – duedl0r

+0

downvoter Jeśli powiedzieć losowy kod, Pokaż zabawny przykład operacji. – BLUEPIXY

Powiązane problemy