目前我正在学习快速排序。我已经遵循了快速排序的规则,但是发现了一件奇怪的事情。
这个过程就像这张图片一样:
请帮我找到我的错误所在:
这是代码:
static void QuickSortFromMiddle(int[] arr, int low, int high)
{
if (low < high)
{
int middleValue = arr[(low+high)/2];
int h = high+1;
int l = low-1;
while (l < h)
{
while (arr[--h] > middleValue && l<h);
while (arr[++l] < middleValue && l<h) ;
if (l >= h)
break;
int temp = arr[l];
arr[l] = arr[h];
arr[h] = temp;
}
QuickSortFromMiddle(arr,low,l-1);
QuickSortFromMiddle(arr, h+1, high);
}
}
/// <summary>
///
/// </summary>
static void QuickSort(int[] arr)
{
QuickSortFromMiddle(arr, 0, arr.Length - 1);
}
/// <summary>
///
/// </summary>
static void TestQuickSort()
{
var arr = new[] { 1, 5, 3, 4, 57, 5, 5, 53 };
QuickSort(arr);
foreach (int i in arr)
{
Console.WriteLine(i);
}
}
这里是结果(我很困惑...)
如Dukeling所说,“枢轴点通常移动到两端之一”
首先,我应该将枢轴点放置在数组的末尾
其次,我应该将枢轴点放置在arr的正确位置(大于左侧,小于右侧)
正确的过程如下: