【问题标题】:Why is my quick sort hanging up?为什么我的快速排序挂断了?
【发布时间】:2015-03-19 08:50:26
【问题描述】:

我正在从一个文件(它只是一个小的(100 个元素)随机整数列表)读入一个向量并尝试使用快速排序对其进行排序,但它挂断了。快速排序函数最终会在我在代码中注释的地方无限重复 i = 0、j = 30、left = 31 和 right = 30。

#include <iostream>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <vector>

using namespace std;

void quicksort(vector<size_t> &fileV, size_t left, size_t right);
void swap(size_t &a, size_t &b);

int main(int argc, char* argv[]){
    if (argc != 2){
        cout << "error: quicks <file name> "<< endl;
        return 1;
    }

    fstream file;
    file.open(argv[1]);
    if (!file.is_open()){
        cout << "error: failed to open file " << argv[1] << endl;
        return 1;
    }

    vector<size_t> fileV;
    size_t ranNum;
    size_t i = 0;
    while(file >> ranNum)
        fileV.push_back(ranNum);

    quicksort(fileV, 0, fileV.size());

    file.close();

    return 0;
}

void quicksort(vector<size_t> &fileV, size_t left, size_t right){
    size_t i = left, j = right, center = (left + right) / 2;
    size_t pivot = fileV[center];

    while (i <= j){
        while (fileV[i] <= pivot)
            i++;
        while (fileV[j] > pivot)
            j--;
        if (i <= j){
            swap (fileV[i], fileV[j]);
            i++;
            j--;
        }
    }

    //repeats infinitely with i = 0, j = 30, left = 31 and right = 30

    if (left < j) 
        quicksort(fileV, left, j);
    if (i < right) 
        quicksort(fileV, i, right);
}

void swap(size_t &a, size_t &b){
    size_t t = a;
    a = b;
    b = t;
}

【问题讨论】:

  • 一点:如果right 应该是独占的,那么您的代码会读取数组的末尾(j 的值被初始化为right,然后从中读取)。这当然是一个错误,尽管这里可能存在其他问题。
  • 我不明白你的意思。我将 J 初始化为向右,然后从 j(现在是最右边的索引)扫描向量,以找到需要与 i 交换的值。
  • 没关系,谢谢,这是一个愚蠢的错误。

标签: c++ sorting vector quicksort


【解决方案1】:

您的分区算法步骤错误。例如,假设我们从:

[1, 2, 3, 2, 8, 9]
 ^i    ^center  ^j

我们进入while循环,首先将i向上移动大于3的第一个元素(8),然后将j向下移动到小于或等于@的第一个元素987654327@(最后一个2):

[1, 2, 3, 2, 8, 9]
          ^j ^i

此时,没有交换发生,我们认为我们的分区已完成。这是错误的:我们需要交换23。不管它为什么最终在某处无限循环,这个实现都没有希望得到正确的答案。

【讨论】:

    猜你喜欢
    • 2011-06-02
    • 1970-01-01
    • 2021-06-19
    • 2015-06-25
    • 2018-03-28
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多