QuickSort C++

//
//  main.cpp
//  Algorithm_rehersal
//
//  Created by  on 13-12-2.
//  Copyright (c) 2013年 . All rights reserved.
//

#include <map>
#include <list>
#include <iostream>
#include <vector>
#include <string>
#include <numeric>
#include <set>
#include <algorithm>
#include <cstdlib>
#include <ctime>

using namespace std;

template<typename T>
struct random_pivot{
    random_pivot(){
        srand(time(NULL));
    }
    T operator()(T begin, T end) {
        return begin + (rand() % (end - begin));
    }
};

template<typename T>
T partition( T begin, T end, T pivot)
{
    swap(*pivot, *begin);
    pivot = begin;
    
    T head = begin;
    T tail = end - 1;
    while( head <= tail )
    {
        while( *tail >= *pivot && head <= tail ) tail--;
        if( *tail < *pivot && head <= tail )
        {
            swap(*pivot, *tail);
            pivot = tail;
            tail--;
        }
        
        while( *head <= *pivot && head <= tail ) head++;
        if( *head > *pivot && head <= tail )
        {
            swap(*pivot, *head);
            pivot = head;
            head++;
        }
    }
    return pivot;
}

template<typename T, typename PF>
void __QuickSort(T begin, T end, PF pf)
{
    if( begin < end-1 )
    {
        T pivot = pf(begin, end);
        pivot = partition(begin, end, pivot);
        __QuickSort(begin, pivot, pf);
        __QuickSort(pivot+1, end, pf);
    }
}

template<typename T>
void QuickSort(T begin, T end)
{
    __QuickSort(begin, end, random_pivot<T>());
}


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

    //  Test case for Quick Sort algorithm.
    
    vector<string> v(10);
    v[0]="Paris";
	v[1]="London";
	v[2]="Stockholm";
	v[3]="Berlin";
	v[4]="Oslo";
	v[5]="Rome";
	v[6]="Madrid";
	v[7]="Tallinn";
	v[8]="Amsterdam";
	v[9]="Dublin";
    
    vector<int> u = {3, 8, 10, 6, 7, 4, 2, 1, 9, 13, 11, 18, 23, 19, 12, 5, 14};
    
    cout << "u before qsort: " << endl;
    for( auto each: u)
    {
        cout << each << " ";
    }
    cout << endl;
    
    QuickSort(u.begin(), u.end());
    
    cout << "u after qsort: " << endl;
    for( auto each: u)
    {
        cout << each << " ";
    }
    cout << endl;
    
    return 0;
}


你可能感兴趣的:(Algorithm,C++,Quicksort)