//
// main.cpp
// Data Structure TRY1
//
// Created by zr9558 on 6/7/13.
// Copyright (c) 2013 zr9558. All rights reserved.
//
// Data Structure C++, Weiss, P.285 quickSort
#include<iostream>
using namespace std;
#include<vector>
#include<math.h>
template<typename Comparable>
void insertionSort(vector<Comparable> &a, int left, int right)
{
int j;
for( int p=left+1; p<=right; ++p)
{
Comparable temp=a[p];
for( j=p; j>left && temp<a[j-1]; --j)
a[j]=a[j-1];
a[j]=temp;
}
}
// Code to perform median-of-three partitioning
template<typename Comparable>
const Comparable &median3(vector<Comparable> &a, int left, int right)
{
int center=(left+right)/2;
if( a[center]<a[left]) swap(a[left],a[center]);
if( a[right]<a[left]) swap(a[left],a[right]);
if( a[right]<a[center]) swap(a[center],a[right]);
//Place pivot at position right-1
swap(a[center],a[right-1]);
return a[right-1];
}
template<typename Comparable>
void quickSort(vector<Comparable> &a, int left, int right)
{
if( left+10<=right)
{
Comparable pivot=median3(a,left,right);
// Begin partitioning
int i=left, j=right-1;
for(;;)
{
while( a[++i]<pivot) ;
while( pivot<a[--j]) ;
if( i<j) swap(a[i],a[j]);
else break;
}
swap(a[i],a[right-1]);//Restore pivot
quickSort(a, left, i-1);
quickSort(a, i+1, right);
}
else insertionSort(a, left, right);
}
template<typename Comparable>
void quickSort(vector<Comparable> &a)
{
quickSort(a,0, int( a.size())-1);
}
int main()
{
vector<int> ivec;
for( int i=0; i<40; ++i)
ivec.push_back(rand()%200);
for( int i=0; i!=ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
quickSort(ivec);
for( int i=0; i!=ivec.size(); ++i)
cout<<ivec[i]<<" ";
cout<<endl;
return 0;
}