随机快速排序

时间:2010-11-19 19:10:36

标签: c++ algorithm

此代码不向我显示任何输出

#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,请帮助

3 个答案:

答案 0 :(得分:5)

程序卡在partition(2, 4)的调用中。数组的相关部分当时为6, 9, 7,因此pivot初始化为6

您输入主while循环,i循环立即终止,因为它始终是第一次循环,因为a[i] == pivot。因此,您输入j循环,该循环执行两次,因为79都大于pivot,仍然是6j循环在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是范围内的最小项目会发生什么。

(如果遇到无限循环,找出它的位置并查看导致它的原因。调试输出帮助或调试器。)