2012-07-04 12 views
5

Mam wersję bubble sort:Liczba transakcji swap w Bubble Sort

int i, j; 

for i from n downto 1 
{ 
    for j from 1 to i-1 
    { 
     if (A[j] > A[j+1]) 
      swap(A[j], A[j+1]) 
    } 
} 

Chcę obliczyć oczekiwaną liczbę swapów stosując powyższą wersję bubble rodzaju. Metodę używaną przeze mnie pokazano poniżej:

// 0 based index 

float ans = 0.0; 

for (int i = 0; i < n-1; i++) 
{ 
    for (int j = i+1; j < n; j++) { 

     ans += getprob(a[i], a[j]); // computes probability that a[i]>a[j]. 
    } 
} 

Czy podążam właściwą drogą, czy też czegoś brakuje?

+7

Dlaczego nie można uruchomić to na randomizowanym zbiorze i dowiedzieć? –

+2

"Liczba" rzadko się pojawia ". I w ogóle nie rozumiem 'getprob()', pobiera liczby, więc może po prostu ... dokładnie odpowiedzieć, co jest z prawdopodobieństwem? – unwind

+1

Jest to prawdopodobnie łatwiejsze do rozwiązania na papierze niż w programie. –

Odpowiedz

5

Najlepszym sposobem uzyskania odpowiedzi jest uruchomienie samego algorytmu sortowania bąbelkowego i uwzględnienie licznika po wywołaniu funkcji swap(). Twoja funkcja obliczeniowa będzie (a) potrzebna prawie tak długo jak sam sortowanie (w zależności od czasu działania swap() vs. getprob()) i (b) pomija punkt, w którym kolejność elementów zmienia się podczas sortowania.

Btw, dokładna liczba połączeń swap() zależy od danych, które należy posortować - masz n * (n-1)/2 porównań i każda z nich może spowodować zamianę (średnio, połowa czas wymiany porównywanych elementów).

+0

@C Stoll: Dostaję twoją uwagę, że średnio przez połowę czasu musisz zamienić porównywalne elementy, ale to ma założenie, że każdy element a [i]> a [j] (i a [j] (i TheRock

+0

@TheRock Liczba zamiany _jest_ liczbą inwersji w tablicy. Jeśli wszystkie wpisy tablicy są różne, a permutacja jest równomiernie rozłożona, oczekiwana liczba zamian to po prostu 'n * (n-1)/4'. Jeśli 'getprob()' jest niezależne od wartości/pozycji, 'p * n * (n-1)/2'. Ale wydaje się, że masz bardziej skomplikowane ograniczenia. –

+0

@ Danielanischer: Nie muszę robić dla ogólnego przypadku, faktycznie w moim przypadku każdy z elementów tablicy może się zmienić z pewnym prawdopodobieństwem, i mogę uzyskać prawdopodobieństwo [i]> a [j] (i TheRock

2

Może to pomaga. Zasadniczo zapewnia to strukturę do uruchamiania sortowania bąbelkowego na zestawie zestawów danych symulacji i do obliczania prawdopodobieństwa wymiany.

Niech to prawdopodobieństwo = p Następnie, aby znaleźć oczekiwaną liczbę operacji wymiany, należy zastosować to do prawdziwego zestawu danych. Niech n będzie wielkości tego zbioru danych. Następnie oczekiwana liczba = swapProbability * n * n

n * n przychodzi, ponieważ sortowanie bąbelkowe ma liczbę n * n oczekiwanych operacji.

float computeSwapProbability() 
{ 
    int aNumSwaps = 0 
    int aTotalNumberOfOperations = 0 

    For all simulation datasets 
    { 


     int i, j; 

     for i from n downto 1 

     { 

      for j from 1 to i-1 

      { 
       aTotalNumberOfOperations++ 

       if (A[j] > A[j+1]) 
       { 
        swap(A[j], A[j+1]) 
        aNumSwaps++ 
       } 

      } 

     } 
    } 

    return (float)aNumSwaps/aTotalNumberOfOperations; 
} 
0
The best way to count swap is to include counter variable inside swap if condition . 

    int swapCount=0; 

    for (i = 0; i < (length-1); ++i) { 
     for (j = 0; j < (length-i-1); ++j) { 
     if(array[j] > array[j+1]) { 
      temp = array[j+1]; 
      array[j+1] = array[j]; 
      array[j] = temp; 
      swapCount++; 
     } 
     } 
    } 

    printf("Swap count : %d" ,swapCount);