En essayant d'apprendre à faire une implémentation de Quicksort, je ne peux pas savoir pourquoi le tri n'est pas correct.Le tri rapide ne triage pas correctement
En utilisant cette séquence:
6, 7, 12, 5, 9, 8, 65, 3
Il renvoie ceci:
3, 5, 7, 8, 9, 65 , 12, 6
Il semble trier un peu, mais pas tous. Qu'ai-je manqué?
Voici mon code:
static void Main(string[] args)
{
QuickSort qs = new QuickSort();
int[] arr = new int[] { 6, 7, 12, 5, 9, 8, 65, 3 };
foreach (int l in arr)
{
Console.Write(l + ", ");
}
int left = 0;
int right = arr.Count() - 1;
int[] arrr = qs.DoQuickSort(ref arr, left, right);
Console.WriteLine("Sorted List: ");
foreach (int i in arrr)
{
Console.Write(i + " ");
}
Console.ReadLine();
}
public int Partition(int[] array, int left, int right, int PivotIndex)
{
int pivValue = array[PivotIndex];
array = Swap(ref array, PivotIndex, right);
int storeIndex = left;
for (int i = PivotIndex; i < right-1; i++)
{
if (array[i] <= pivValue)
{
array = Swap(ref array, i, storeIndex);
storeIndex = storeIndex + 1;
}
}
array = Swap(ref array, storeIndex, right);
return storeIndex;
}
public int[] Swap(ref int[] arr, int first, int second)
{
int temp = arr[first];
arr[first] = arr[second];
arr[second] = temp;
return arr;
}
public int[] DoQuickSort(ref int[] array, int left, int right)
{
if (right > left)
{
int PivIndex = (left + right)/2;
int newPivIndex = Partition(array, left, right, PivIndex);
DoQuickSort(ref array, left, newPivIndex - 1);
DoQuickSort(ref array, newPivIndex + 1, right);
}
return array;
}
vous avez vraiment besoin de commencer à poster votre code complet. Vous continuez à nous montrer la fonction de partition et la fonction quicksort et vous ne nous montrez pas les méthodes principales. Vous l'avez fait de nombreuses fois sur ce sujet sur ce site. – JonH
On dirait qu'il vous manque quelques lignes au début - est-ce que cela vous a été enlevé par accident?(edit: oops, nevermind, les accolades étaient juste étrangement alignées) –
En ce qui concerne le style de codage et les standards, PivotIndex est un paramètre de la méthode Partition et PivIndex est une variable locale de la méthode DoQuickSort. Pour cette raison, la convention dit que les deux devraient commencer par une lettre minuscule, c'est-à-dire, pivotIndex et pivIndex. De plus, vous passez votre tableau par référence (ref int [] tableau), ce qui n'est pas nécessaire. Les tableaux sont déjà des références d'objet et vous modifiez leurs éléments constitutifs, pas la référence de tableau elle-même. –