2011-01-05 4 views
1

J'ai adapté la méthode QuickSort pour trier la rangée de tableaux. Voici le code:Matrix Row - Problème de récurrence QuickSort

Que l'on fonctionne très bien

static void QuickSort(int lowBound, int highBound, int[] a) 
     { 
      int temp = 0; 
      int x = random.Next(lowBound, highBound); 
      int pivot = a[x]; 
      int i = lowBound; 
      int j = highBound; 
      do 
      { 
       while (a[i] < pivot) i++; 
       while (pivot < a[j]) j--; 
       if (i <= j) 
       { 
        temp = a[i]; //changes an element smaller than the pivot... 
        a[i] = a[j];//... with the greater one 
        a[j] = temp; 
        i++; j--; 
       } 

      } 
      while (i <= j); 
      if (lowBound < j) { QuickSort(lowBound, j, a); }//recursion 
      if (i < highBound){ QuickSort(i,highBound, a); } 
     } 

Voici la méthode problématique

static void QuickSortMatrix(int[,] a) 
     { 
      int n = a.GetLength(0); 
      int m = a.GetLength(1); 
      for (int i = 0; i < n; i++) 
      { 
       QuickSortRow(0, m - 1, i, a); 
      } 
      for (int j = 0; j < m; j++) 
      { 
       QuickSortRow(0, n - 1, j, a); 
      } 

     } 
     static void QuickSortRow(int lowBound, int highBound, int row, int[,] a) 
     { 
      int temp = 0;    
      int x = random.Next(lowBound, highBound); 
      int pivot = a[row,x]; 
      int p = lowBound; 
      int q = highBound; 
      do 
      { 
       while (a[row,p] < pivot) p++; 
       while (pivot < a[row,q]) q--; 
       if (p <= q) 
       { 
        temp = a[row,p]; 
        a[row,p] = a[row,q]; 
        a[row,q] = temp; 
        p++; q--; 
       } 

      } 
      while (p <= q); 
      if (lowBound < q) { QuickSortRow(lowBound, q, row, a); } 
      if (p < highBound) { QuickSortRow(p, highBound,row, a); } 
     } 

Au début, quand bur ok la boucle « pour » est tout exécuté pour une raison quelconque lors de l'exécution récursive la ligne qui devrait être constante lors de l'appel de la méthode sort des limites de la matrice. Voici mon tableau et les lignes atteint la valeur de 4

int[,] matrix = 
       { 
        {7,8,9,10,11,5}, 
        {3,6,4,16,22,4}, 
        {7,9,17,8,3,21}, 
        {24,7,11,19,3,4} 
       }; 

J'espère que mon explication était assez claire.

Quelqu'un pourrait-il me conseiller? Qu'est-ce qui me manque ici?

Nous vous remercions de votre aide!

BR Stephan

+1

Pour un, les noms de variables avec plus de 1 caractère sont utiles. C'est difficile à lire –

+2

C'est impossible à lire. Pourquoi utiliser 'q' au lieu de 'highBound'? Le premier n'est pas du tout descriptif tandis que le second me dit ce que cette variable fait d'un coup d'oeil. Au lieu de 'q', pourquoi ne pas utiliser 'highBoundTmp', ou 'currentHighBound' ou quelque chose? – Amy

+0

Merci les gars je vais en tenir compte dans l'avenir – kidwon

Répondre

1

n est le nombre de lignes dans la matrice (4)

m est le nombre de colonnes dans la matrice (6)

Dans votre deuxième boucle vous allez 0..m et en passant cette valeur au paramètre row. Il explose parce qu'il y a plus de colonnes dans la matrice que de lignes. c'est-à-dire qu'il essaie de lire la matrice [4, 0]. Remarque: dans la mesure où je peux dire que vous n'avez pas besoin de la deuxième boucle parce que vos lignes sont déjà triées après la première boucle. Retirez-le et il ne lancera pas d'exception.

+0

Merci, j'appelle la mauvaise méthode dans la deuxième boucle, n'a pas vu cela et bien sûr je sors des limites! – kidwon