【问题标题】:Problem with implementing QuickSort with C++使用 C++ 实现快速排序的问题
【发布时间】:2019-07-05 01:45:27
【问题描述】:

因此,对于这个简单的代码,答案部分正确。结果是“1 1 2 3 4 4 2 6 8 5 " 我认为问题应该与递归和分区有关。我哪里做错了??

#include <iostream>

using namespace std;


void swap(int* a, int* b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
void quick_sort(int num[], int low, int high){
    int i = low - 1;
    int pivot = num[high];
    for(int j = low; j <= high -1; j++){
        if(num[j] <= pivot){
            i++;
            swap(&num[i], &num[j]);
        }
        else{
            continue;
        }
    swap(&num[i+1], &num[high]);
    quick_sort(num, low, i);
    quick_sort(num, i+2, high);
    }
}

int main(){
    int test[] = {3,1,2,6,5,4,8,1,2,4};
    quick_sort(test, 0, sizeof(test)/sizeof(test[0])-1);
    for(int i = 0; i < sizeof(test)/sizeof(test[0]); ++i){
        cout << test[i] << endl;
    }
    return 0;

}

【问题讨论】:

  • 我不明白。 low0 开始,但 ilow - 1。因此,在您的第一次迭代中,您的索引等于 -1?
  • @KABoissonneault 我几乎做了同样的跳跃,但他在使用它之前在循环中至少做了一次 i++ :) 以及其他任何地方 i+1 或 i+2 所以没关系。 . 就这一点而言。
  • 为什么不在你最喜欢的调试器中单步调试代码,同时观察变量?
  • using namespace std; + void swap(int* a, int* b) 从长远来看不会有好的结局。阅读:stackoverflow.com/questions/1452721/…
  • 另见:C++ quicksort

标签: c++ algorithm quicksort


【解决方案1】:

您的问题是 for 循环。 i 值应在 for 循环完成后更新,然后将 i 值用于交换和其他 quick_sort 调用。但是您的源代码,我在 for 循环中进行了更新,并将其用于交换和其他 quick_sort 调用。这就是问题所在。这是我的解决方案:

#include <iostream>

using namespace std;


void swap(int* a, int* b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}
void quick_sort(int num[], int low, int high) {
    if (low >= high) return;
    int i = low - 1;
    int pivot = num[high];
    for (int j = low; j <= high - 1; j++) {
        if (num[j] <= pivot) {
            i++;
            swap(&num[i], &num[j]);
        }
        else {
            continue;
        }
    } // move to correct line
    swap(&num[i + 1], &num[high]);
    quick_sort(num, low, i);
    quick_sort(num, i + 2, high);
    // } this line should be moved to another line
}

int main() {
    int test[] = { 3,1,2,6,5,4,8,1,2,4 };
    quick_sort(test, 0, sizeof(test) / sizeof(test[0]) - 1);
    for (int i = 0; i < sizeof(test) / sizeof(test[0]); ++i) {
        cout << test[i] << endl;
    }
    return 0;

}

【讨论】:

  • 对不起,我看不出你的 for 循环和我的有什么不同。
  • 现在可以看到了吗?
  • 您可能应该编辑它以不包含using namespace std; 并选择std:: 前缀。尤其是swap
  • 是的,我注意到了。谢谢。
【解决方案2】:

就像@Loc Tran 指出的那样,您的枢轴交换和随后的左右快速排序必须在 for 循环之外。不需要else continue;。 for 循环的目的是找到pivot 元素的位置(i),使得左边的所有元素都小于pivot,而右边的所有元素都大于pivot

一旦位置(i+1)被确定,通过交换将枢轴放在那里,然后对pivot的左侧和右侧进行快速排序。

另外你应该只在low &lt; high时进行快速排序。

#include <iostream>

using namespace std;


void swap(int* a, int* b){
    int temp = *a;
    *a = *b;
    *b = temp;
}
void quick_sort(int num[], int low, int high){
    if(low >= high)
        return;
    int i = low - 1;
    int pivot = num[high];
    for(int j = low; j <= high -1; j++){
        if(num[j] <= pivot){
            i++;
            swap(&num[i], &num[j]);
        }
    }
    swap(&num[i+1], &num[high]);
    quick_sort(num, low, i);
    quick_sort(num, i+2, high);
}

int main(){
    int test[] = {3,1,2,6,5,4,8,1,2,4};
    quick_sort(test, 0, sizeof(test)/sizeof(test[0])-1);
    for(int i = 0; i < sizeof(test)/sizeof(test[0]); ++i){
        cout << test[i] << endl;
    }
    return 0;

}

【讨论】:

    猜你喜欢
    • 2016-10-02
    • 2023-01-31
    • 2018-09-20
    • 2011-11-03
    • 2011-03-29
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多