简体   繁体   中英

quicksort, helper class problems, timesort, vector, c++

my biggest problem is getting the quickSortHelper class to work. i know what i want the parameters to be, and the stuff inside i need to call on is what i can't figure out. i've tried a mixture of using the partition and quicksort but i can't figure it out. the code is written like this because i will be using a timesort class in the future to solve and time 6+ sorting algorithms. i got it to work by just throwing the code inside main. but all i want inside main is what i have here.

#include <iostream>
#include <algorithm>
#include <vector>
#include <chrono>
#include <functional>
#include <random> 

//i know not all the above libraries are being used, once quickSort is 
//working i plan on adding it to 5 other sorting algorithms, where these
//are neccessary.

using namespace std;

void quickSort(vector<int>&, int, int);
int partition(vector<int>&, int, int);
double timeSort(vector<int> &v, function<void(vector<int>&)>f);

int main()
{
    vector<int>intVec(1000);
    generate(intVec.begin(), intVec.end(), rand);

    int p = 0;
    int q = 1000;
    quickSort(intVec, p, q);

    auto time = timeSort(intVec, quickSort);
    for (auto i = 0u; i != intVec.size(); ++i)
    cout << intVec[i] << " ";
    cout << "\nQuick sort took " << time << " nanoseconds\n";

    char chubby;
    cin >> chubby;
    return 0;
}
double timeSort(vector<int> &v, function<void(vector<int>&)>f)
{
    auto start = chrono::high_resolution_clock::now();
    f(v);
    auto end = chrono::high_resolution_clock::now();
    return static_cast<double>(((end - start).count()));
}
int partition(vector<int>&intVec, int p, int q)
{
    int x = intVec[p];
    int i = p;
    int j;

for (j = p + 1; j < q; j++)
{
    if (intVec[j] <= x)
    {
        i = i + 1;
        swap(intVec[i], intVec[j]);
    }
}

    swap(intVec[i], intVec[p]);
    return i;
}

void quickSort(vector<int>&intVec, int p, int q)
{
    int r;
    if (p < q)
    {
        r = partition(intVec, p, q);
        quickSort(intVec, p, r);
        quickSort(intVec, r + 1, q);
    }
}
void quickSortHelper(vector<int>&intVec)
{
    //i want to make a call to the timeSort function with
    //quickSortHelper, i can't use quickSort directly because timeSort
    //only has 2 parameters, the vector to be solved, and the method of
    //solving it. i know 

}

I suggest simplifying your program:

int main(void) 
{
    vector<int>intVec(1000);
    unsigned int duration = 0;
    for (unsigned int iteration = 0;
         iteration < 1000000;
         ++iteration)
    {
        generate(intVec.begin(), intVec.end(), rand);

        int p = 0;
        int q = 1000;
        auto start = chrono::high_resolution_clock::now();
        quickSort(intVec, p, q);
        auto end = chrono::high_resolution_clock::now();
        duration += (end - start);
    }
    cout << "Average time for quicksort: " << (duration / 1000000) << "\n";
    cout.flush();

    return 0;
}

I made the following changes:
1) Running the sort for many iterations to get an average duration.
2) Removed the timing function; it only complicates things.

Umm... If I understand correctly, this should do it:

void quickSortHelper(vector<int>&intVec)
{
    quickSort(intVec, 0, intVec.size());
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM