这个算法好吗?我可以改进它吗?
static void QuickSort(int[] a)
{
QuickSort(a, 0, a.Length - 1);
}
static void QuickSort(int[] a, int start, int end)
{
if (start >= end)
{
return;
}
int num = a[start];
int i = start, j = end;
while (i < j)
{
while (i < j && a[j] > num)
{
j--;
}
a[i] = a[j];
while (i < j && a[i] < num)
{
i++;
}
a[j] = a[i];
}
a[i] = num;
QuickSort(a, start, i - 1);
QuickSort(a, i + 1, end);
}发布于 2016-11-25 07:48:03
该算法不可读。通常,人们都记不起快速排序的细节,即使代码写得很完美,人们仍然很容易迷路。而且,快速排序有点棘手,在哪里设置枢轴点,有多个选择。有几个想法要分享:
让我以我的实践为例:我所做的C#代码:
public static void quickSort(int[] A, int left, int right)
{
if(left > right || left <0 || right <0) return;
int index = partition(A, left, right);
if (index != -1)
{
quickSort(A, left, index - 1);
quickSort(A, index + 1, right);
}
}
private static int partition(int[] A, int left, int right)
{
if(left > right) return -1;
int end = left;
int pivot = A[right]; // choose last one to pivot, easy to code
for(int i= left; i< right; i++)
{
if (A[i] < pivot)
{
swap(A, i, end);
end++;
}
}
swap(A, end, right);
return end;
}
private static void swap(int[] A, int left, int right)
{
int tmp = A[left];
A[left] = A[right];
A[right] = tmp;
}参考文献:
发布于 2016-09-29 21:09:21
虽然将递归算法转换为迭代形式(反之亦然)是建立字符的,但我不太担心迭代还是递归。
有几种方法可以改进此代码。
IList<int>进行排序。为什么是国家统计局?您可以对所有可以一致比较的事物集合进行排序,这将使排序算法更有用。start和end非常清楚。i,j和num不是。这段代码的读者应该如何理解它的功能呢?将num重命名为它是什么:支点。Debug.Assert,它在返回之前记录方法确保的内容是真的。在您的例子中,后置条件是“数组从开始到结束排序”。因此,请断言;编写一些“已排序”的谓词并验证它是否有效。这将帮助您找到bug,如果有任何。这将帮助未来的代码读者理解它。它将帮助那些在未来修改代码的人理解在修改代码时需要避免中断的地方。发布于 2016-10-01 10:43:18
我试过你的算法
int[] data = new [] { 17, 20, 11, 8, 0, 1, 14, 9, 9, 15, 5, 12, 8, 11, 16, 11, 11, 9, 16, 18 };但不起作用。它在外部循环中无限循环。
我可以这样做:
public static void QuickSort(int[] a)
{
QuickSort(a, 0, a.Length - 1);
}
static void QuickSort(int[] a, int start, int end)
{
if (start >= end)
{
return;
}
int num = a[start];
int i = start - 1;
int j = end + 1;
while (true)
{
do
{
i++;
} while (a[i] < num);
do
{
j--;
} while (a[j] > num);
if (i >= j)
break;
Swap(a, i, j);
}
//a[i] = num;
QuickSort(a, start, j);
QuickSort(a, j + 1, end);
}
static void Swap(int[] a, int i, int j)
{
if (i == j)
return;
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}https://codereview.stackexchange.com/questions/142808
复制相似问题