我正在编写一个Quicksort算法而没有检查现有代码,我想出了以下代码:
public class QuicksortV7
{
public void QuickSort(int[] arr, int start, int end)
{
int pivot = start;
int left = start + 1;
int right = end;
while (left < right)
{
while (arr[left] <= arr[pivot] && left <= right) { left++; }
while (arr[right] >= arr[pivot] && right >= left) { right--; }
if (left >= right)
{
if (arr[pivot] > arr[right])
{
int aux = arr[pivot];
arr[pivot] = arr[right];
arr[right] = aux;
}
QuickSort(arr, start, right - 1);
QuickSort(arr, right + 1, end);
}
else
{
int aux = arr[left];
arr[left] = arr[right];
arr[right] = aux;
}
}
}
}
static void Main(string[] args)
{
int[] arr = new int[] { 69, 66, 92, 53, 11, 40, 59, 60, 17, 13, 53, 46, 30 };
var quick = new QuicksortV7();
quick.QuickSort(arr, 0, arr.Length - 1);
}
似乎这不好,因为给定的数组示例失败了:
int[] arr = new int[] { 69, 66, 92, 53, 11, 40, 59, 60, 17, 13, 53, 46, 30 };
运行后的上述数组是:
11, 13, 30, 17, 40, 46, 53, 53, 59, 66, 60, 69, 92
我一直试图通过指令在纸质指令上进行测试,但我无法解决问题
欢迎任何提示,谢谢
答案 0 :(得分:0)
我玩了你的代码并发现了一些问题。我在下面的评论中注意到它们。 我得到了你的示例输入。
public void QuickSort(int[] arr, int start, int end)
{
int pivot = start;
int left = start + 1;
int right = end;
while (left <= right)
{
while (arr[left] < arr[pivot] /*&& left <= right */) { left++; }
while (arr[right] > arr[pivot] /*&& right >= left*/) { right--; }
if (left <= right)
{
//if (arr[pivot] > arr[right]) // This if is not needed
//{
int aux = arr[left]; //Swap left and right, not pivot
arr[left] = arr[right];
arr[right] = aux;
left++;
right--;
// }
// This is done after the sorting loop
//QuickSort(arr, start, right - 1);
//QuickSort(arr, right + 1, end);
}
//else
//{
// int aux = arr[left];
// arr[left] = arr[right];
// arr[right] = aux;
//}
}
// Do recursion after sorting loop is done
if (start < right)
QuickSort(arr, start, left);
if (left < end)
QuickSort(arr, left, end);
}
答案 1 :(得分:-2)
由于该算法是一种分而治之的分类技术。我通常喜欢将快速排序算法分成两个单独的方法。用于递归调用它的快速排序调用方法和用于拆分元素的分区方法。
您基本上试图将完整的递归排序算法塞入一个方法中。将从此示例中记下并再次尝试。
public void Quicksort(int[] array, int low, int high)
{
int pivot = 0;
if(high > low)
{
pivot = Partition(array, low, high);
QuickSort(array, low, pivot - 1);
QuickSort(array, pivot + 1, high);
}
}
public static int Partition(int[] array, int low, int high)
{
int left, right, piviot_item, = A[low];
left = low;
right = high;
while(left < right)
{
// move left while item < piviot
while (array[left] < array[right])
{
left++;
}
while(array[right] > pivot_item)
{
// move right while item > piviot
right--;
}
if(left < right)
{
// swap the left and right item within the array
swap(array, left, right)
}
}
// final position of pivot
array[low] = a[right];
}