【问题标题】:QuickSort Hoare's partitioning not workingQuickSort Hoare 的分区不起作用
【发布时间】:2016-02-12 12:41:27
【问题描述】:

嗨,我已经尝试编写 Hoare 的分区函数 5 个小时了。我阅读了thisthis,甚至直接从这些问题中复制了“正确”功能,但仍然离答案很远。这是我从 Cormen 的书中“翻译”的代码。

int Hpartition(int A[], int p, int r){
int x = A[p];
int i = p - 1;
int j = r + 1;
while(true){
    do{
        j--;
    }while(A[j] <= x);
    do{
        i++;
    }while(A[i] >= x);
    if(i < j){
        swap(A[i],A[j]);
    }
    else
        return j;
 }
}

快速排序:

void qs(int A[],int p,int r){
if(p<r){
    int q=Hpartition(A,p,r);
    qs(A,p,q-1);
    qs(A,q+1,r);
}
}

主要:

int main(int argc, const char * argv[]) {
int tab[10];

for(int k=0;k<10;k++){
    cin >> tab[k];
}


qs(tab,0,9);

for(int i=0;i<10;i++){
    cout << tab[i] << " ";
}
return 0;
}

对于这个数据:

2 4 1 3 5 7 6 8 10 9

它产生这个结果:

2 4 9 3 5 7 6 8 10 1

根据之前关于该主题的问题,我知道书中可能存在一些错误。但即使我应用前面问题的答案,它也不起作用。

这是书中的算法:

HOARE-PARTITION(A, p, r)
1 x = A[p]
2 i = p - 1
3 j = r + 1
4 while TRUE
5     repeat
6        j = j - 1
7     until A[j] <= x
8     repeat
9        i = i + 1
10    until A[i] >= x
11    if i < j
12        exchange A[i] with A[j]
13    else return j

提前感谢您的帮助。

【问题讨论】:

  • do..whilerepeat..until 使用反向中断条件:只要x 为真,while(x) 就会重复,until(x) 停止,一旦x 变为真

标签: sorting quicksort partition


【解决方案1】:

您在翻译书中的代码时有 2 个错误:

do{
     j--;
  }while(A[j] <= x);

你应该反过来:

do{
     j--;
  }while(A[j] > x);

同理:

do{
     i++;
  }while(A[i] >= x);

这里还有一个:

qs(A,p,q-1);
qs(A,q+1,r);

改为:

qs(A,p,q);
qs(A,q+1,r);

【讨论】:

  • 非常感谢。如果你来波兰,请联系我。啤酒给我!!
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 2017-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-15
  • 2018-05-27
  • 1970-01-01
相关资源
最近更新 更多