c#快速排序算法无法继续
我刚刚在c#中完成了快速排序的实现,但后来我遇到了这样一个问题。当我使用我的函数时c#快速排序算法无法继续,c#,arrays,algorithm,sorting,quicksort,C#,Arrays,Algorithm,Sorting,Quicksort,我刚刚在c#中完成了快速排序的实现,但后来我遇到了这样一个问题。当我使用我的函数时 static void QS(int[] arr, int left, int right){ int pivot = left; int temp; int i = left + 1; int j = left + 1; do { if (arr [i] < arr [pivot]) {
static void QS(int[] arr, int left, int right){
int pivot = left;
int temp;
int i = left + 1;
int j = left + 1;
do {
if (arr [i] < arr [pivot]) {
temp = arr [j];
arr [j] = arr [i];
arr [i] = temp;
i++;
}
else{}
j++;
}while(j<=right);
temp = arr [pivot];
arr [pivot] = arr [i - 1];
arr [i - 1] = temp;
}
我得到的结果如下:
9、12、19、8、7、13、10、71、18、34、90、15、3
。
在这个问题上花了几个小时,我仍然不太明白为什么索引I不继续进行。也许问题比我想象的要多
我省略了递归调用以集中精力于函数本身。我正在使用以下伪代码:
Partiton(A,l,r)
//[input corresponds to A[l…r]]
p:=A[l]
i:=l+1
for
j=l+1 to r
if A[j] < p
swap A[j] and A[i]
i:=i+1
swap A[l] and A[i‐1]
partton(A、l、r)
//[输入对应于[l…r]]
p:=A[l]
i:=l+1
对于
j=l+1至r
如果A[j]
有几件事:
在do-while循环中,您丢失了移动索引指针的比较(while循环),以及使快速排序真正起作用的递归调用。记住当你交换你的值时,递增i和递减j。其次,对于值i和j,不要将1添加到那些索引中,因为它们可能会给您带来越界错误,我假设您将像这样调用快速排序:快速排序(arr,0,arr.Length-1);。最后,请选择pivot作为中间值,因为它产生更快的排序时间和结果,而不是选择数组中的第一个值
我将这样写:
quicksort(arr[], begin, end)
{
pivot = (begin + end) / 2
left = begin;
right = end;
while (left <= right)
{
while (arr[left] < pivot)
{
left++;
}
while (arr[right] > pivot)
{
right--;
}
if (left <= right)
{
swap(arr, left, right);
left++;
right--;
}
}
//do your recursive call logic here
}
快速排序(arr[],开始,结束)
{
枢轴=(开始+结束)/2
左=开始;
右=结束;
while(左枢轴)
{
对--;
}
如果(左)变量计数不可用declared@Shekhar也没有使用它;为什么要声明它呢?它是在函数外部声明的,以查看索引我在哪里无法继续,但我将删除它以使代码更清晰。首先,快速排序是一种递归算法,您的代码示例不会递归。我省略了代码的递归部分,以集中讨论fuNCION本身即使在首次使用后也会产生错误的结果
quicksort(arr[], begin, end)
{
pivot = (begin + end) / 2
left = begin;
right = end;
while (left <= right)
{
while (arr[left] < pivot)
{
left++;
}
while (arr[right] > pivot)
{
right--;
}
if (left <= right)
{
swap(arr, left, right);
left++;
right--;
}
}
//do your recursive call logic here
}