此代码不向我显示任何输出
#include <cstdlib>
#include <iostream>
using namespace std;
int partition(int a[], int left, int right) {
int i = left;
int j = right;
int temp;
int pivot = a[left];
while(i <= j) {
while(a[i] < pivot)
i++;
while(a[j] > pivot)
j--;
if(i>j) break;
if (i<j){
temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
}
return i;
}
int randomized_partition(int a[], int left, int right){
int t = left + rand() % (right - left + 1);
std::swap(a[right], a[t]);
return partition(a, left, right);
}
void randomized_quicksort(int a[], int l, int r){
if(l> = r) return;
int q = randomized_partition(a, l, r);
randomized_quicksort(a, l, q-1);
randomized_quicksort(a, q+1, r);
}
int main(){
int a[] = {12, 6, 4, 7, 9, 10, 11, 14, 13, 19, 18, 21, 20};
int n = sizeof(a) / sizeof(n);
randomized_quicksort(a, 0, n-1);
for (int i = 0; i < n; i++){
cout << a[i] << " " << endl;
}
return 0;
}
来自算法第三版的介绍中的randomized_quicksort,请帮助
答案 0 :(得分:5)
程序卡在partition(2, 4)
的调用中。数组的相关部分当时为6, 9, 7
,因此pivot
初始化为6
。
您输入主while
循环,i
循环立即终止,因为它始终是第一次循环,因为a[i] == pivot
。因此,您输入j
循环,该循环执行两次,因为7
和9
都大于pivot
,仍然是6
。 j
循环在j == 2
时终止,因为a[j] == pivot
。
继续前进,第一个条件是false
,因为i
不大于j
。第二个条件是false
,因为i
不小于j
。这标志着主while
循环的结束,因此我们检查循环的条件并发现它是true
,因为i
等于j
。我们没有更改任何数组元素的值,因此内部while
循环永远不会再次运行,条件仍为false
。你陷入无限循环,从未取得任何进展。
仔细看看你的教科书。要么是书中有错误,要么是你弄错了。
答案 1 :(得分:0)
当你运行程序时,是否会立即打开和关闭控制台窗口?将此放在return 0
main
函数system("pause")
之前{。}}。
答案 2 :(得分:0)
int pivot=a[left];
while(i<=j){
while(a[i]<pivot)
i++;
while( a[j]>pivot)
j--;
if(i>j) break;
if (i<j){
temp=a[i];
a[i]=a[j];
a[j]=temp;
i++;
j--;
}
}
考虑如果pivot是范围内的最小项目会发生什么。
(如果遇到无限循环,找出它的位置并查看导致它的原因。调试输出帮助或调试器。)