我编写了一个基于伪代码的QuickSort算法。 我现在已经运行了大约4个小时的输出,我似乎无法找到我的算法开始脱轨的确切原因。这种收集逻辑是我所挣扎的。
无论如何,每当我运行我的程序时,有3种可能的结果:
鉴于我的结果,它让我相信某些事情与我正在使用的index
变量有关。但是,我可以'弄清楚它为什么或出了什么问题。
这是我用于QuickSort算法的所有代码:
public void QuickSort(IList<int> list, int l, int r)
{
if (l>=r) return;
int index = Partition(list, l, r);
Console.WriteLine("index: " + index);
QuickSort(list, l, (index-1));
QuickSort(list, (index+1), r);
}
public int Partition(IList<int> list, int l, int r)
{
int pivot = list[l];
int i = l;
int j = r + 1;
do
{
do { i++; } while(i < list.Count && list[i] < pivot);
do { j--; } while(j > 0 && list[j] >= pivot);
Swap(list, i, j);
} while(i<j);
Swap(list, i ,j);
Swap(list, j, l);
return j;
}
public void Swap(IList<int> list, int i, int j)
{
//Console.WriteLine("Swapping [i] " + list[i] + " with [j] " + list[j]);
//PrintList(list, i, j, false);
int temp = list[i];
list[i] = list[j];
list[j] = temp;
//PrintList(list, j, i, true);
}
PrintList仅用于测试我的输出。
以下是输入/输出示例:
INPUT: [18,43,5,73,59,64,6,17,56,63]
输出:[5,6,18,17,43,59,56,63,64,73]
答案 0 :(得分:2)
您的分区方法存在一个问题:
int i = l;
int j = r + 1;
do
{
do { i++; } while(i < list.Count && list[i] < pivot);
do { j--; } while(j > 0 && list[j] >= pivot);
Swap(list, i, j);
} while(i<j);
如果您使用l == 0
输入,则第一次通过循环时会增加i
,并且选中的第一项是list[1]
。您可能希望这些do
循环为while
循环。
另一个问题是你无条件地在你的循环中交换list[i]
和list[j]
,即使是list[i] <= list[j]
。您可能应该在进行交换之前进行检查。
这不会解决你所有的问题,但它会指出你正确的方向。
答案 1 :(得分:1)
public int Partition(IList<int> list, int l, int r){
int pivot = list[l];
int i = l+1;
int j = r;
while(true){
//{i,j| l< i,j <= r}
while(i<=r && list[i] < pivot)++i;
while(j>l && list[j] >= pivot)--j;
if(i<j)
Swap(list, i, j);
else
break;
}
Swap(list, l, j);
return j;
}