Попытка узнать о выполнении Quicksort, я не могу понять, почему он не сортируется правильно.Quicksort не правильно сортируется
Используя эту последовательность:
6, 7, 12, 5, 9, 8, 65, 3
Он возвращает это:
3, 5, 7, 8, 9, 65 , 12, 6
Кажется, что-то немного, но не все. Что я пропустил?
Вот мой код:
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;
}
Вам действительно нужно начать публикацию полного кода. Вы продолжаете показывать нам функцию разделения и функцию quicksort, и вы не показываете нам основные методы. Вы делали это много раз по этому вопросу на этом сайте. – JonH
Похоже, вы вначале пропустили несколько строк - это случайно произошло?(edit: oops, nevermind, скобки были просто смещены) –
В качестве стиля и стандартов кодирования PivotIndex является параметром метода Partition, а PivIndex является локальной переменной метода DoQuickSort. Из-за этого в соглашении говорится, что оба должны начинаться с буквы нижнего регистра, то есть pivotIndex и pivIndex. Кроме того, вы передаете массив по ссылке (ref int [] array), что необязательно. Массивы уже являются ссылками на объекты, и вы изменяете их составные элементы, а не ссылку на массив. –