Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找第n个最大数无限循环C++_C++_Loops_Quicksort - Fatal编程技术网

查找第n个最大数无限循环C++

查找第n个最大数无限循环C++,c++,loops,quicksort,C++,Loops,Quicksort,我有一个N个数的向量,我想找到数组中的第N个数。我使用的是quicksort的一种变体,但有时会遇到无限循环的问题,我认为这是因为在两个数组中,最大的数字是唯一的选项。一个数字可能会在数组中出现很多次,因此,例如,如果我为N选择10,并且我想找到第一个最大的数字,我可能会在左数组中以{9,9}结束,从而导致一个无限循环。我能做些什么来补救这个问题?这是我的密码 #include <iostream> #include <time.h> #include <stdli

我有一个N个数的向量,我想找到数组中的第N个数。我使用的是quicksort的一种变体,但有时会遇到无限循环的问题,我认为这是因为在两个数组中,最大的数字是唯一的选项。一个数字可能会在数组中出现很多次,因此,例如,如果我为N选择10,并且我想找到第一个最大的数字,我可能会在左数组中以{9,9}结束,从而导致一个无限循环。我能做些什么来补救这个问题?这是我的密码

#include <iostream>
#include <time.h>
#include <stdlib.h>
#include <vector>

using namespace std;
int partition(int n, int arrsize, vector<int> intarr); //pass vector by val

int main() {

    int n, N;

    cout << "Please enter n: " << endl;
    cin >> n;
    cout << "Please enter N: " << endl;
    cin >> N;

    vector<int> array;
    srand(time(NULL));

    for(i=0; i < N; i++) {
        array.push_back(1 + rand() % N);
        cout << array.at(i) << ", ";
    }

    //Get the nth largest value of array[N]
    int arraylen = array.size();
    cout << "\nArraylen is " <<  arraylen << endl;
    int result = partition(n, arraylen, array);

    cout << "The " << n << "th largest number is: " << result <<endl;

    return 0;
}

int partition(int n, int arrsize, vector<int> intarr) {
    //1. Get a random value from the array:
        int random = rand() % arrsize;
        int pivot = intarr.at(random);

    //2. Partition the array into 2 halves left < pivot > right
        vector<int> left;
        vector<int> right;

        for(int j=0; j < arrsize; j++) {
            if (intarr[j] >= pivot)
                left.push_back(intarr[j]);
            else if (intarr.at(j) < pivot)
                right.push_back(intarr[j]);
            else continue;
        }

        cout << "\n \n" << "Left = ";

        for(int k = 0; k < left.size(); k++) {
            cout << left.at(k) << ", ";
        }

        cout << endl << "Right = ";

        for(int k = 0; k < right.size(); k++) {
            cout << right.at(k) << ", ";
        }

        int leftlen = left.size();
        int rightlen = right.size();

        if (n < leftlen)
            return partition(n, leftlen, left);

        else if (n > (arrsize - rightlen)) {
            n = n - (leftlen);
            return partition(n, rightlen, right);
        }

        else return pivot;

}

检查其中一个子数组是否为空将有助于检测无限循环,在其他一些情况下也会检测到崩溃

int leftlen = left.size();
int rightlen = right.size();
if (leftlen == 0 || rightlen == 0) /* break processing */

只有当其中一个数组为0且另一个数组填充了相同的值时,才可以编辑无限循环

既然您正在创建新的向量,我想是因为您不想改变输入向量,那么您最好避免将枢轴元素放在左侧或右侧。在这种情况下,如果pivot是您正在寻找的元素,它将被else return pivot捕获,并且如果您最终得到退化的情况,即分区都是相等的元素,那么将不会在左侧或右侧放置任何内容,并且分区的单个值将正确返回


快速排序避免此问题的方法是永远不要将枢轴元素放入正在排序的子向量中;因此,即使其中一个向量最终都是相同的元素,它仍然比原来短。这是quicksort的一个微妙之处,很少得到很好的解释,尽管Sedgwick确实讨论了如何提高quicksort在包含许多重复元素的向量上的性能

这是一个练习,还是可以接受使用?@juanchopanza我正在Careercup网站上做一些练习。我知道如何使用第n_元素函数,但我想知道长版本的Toon,如果n