Code:
#include <iostream>
using namespace std;
template <class T> class CSortAlgorithm
{
public:
typedef unsigned int t_length;
typedef unsigned int t_pos;
static void swap(T& a, T& b);
static bool SelectionSort(T elements[], t_length length);
static bool InsertSort(T elements[], t_length length);
static bool BubbleSort(T elements[], t_length length);
static bool QuickSort(T elements[], t_length length);
private:
static bool QuickSort(T elements[], t_pos left, t_pos right);
};
//----------------------------------------------------------------------------------------|
//----------------------------------------------------------------------------------------\
template <class T> void CSortAlgorithm<T>::swap(T& a, T& b)
{
T tmp = a;
a = b;
b = tmp;
}
template <class T> bool CSortAlgorithm<T>::SelectionSort(T elements[], t_length length)
{
bool retval = true;
t_pos minpos;
for(t_pos i=0; i<length; i++)
{
minpos = i;
for(t_pos k=i; k<length; k++)
{
if( elements[k] < elements[minpos] )
{
minpos = k;
}
}
CSortAlgorithm<T>::swap(elements[i], elements[minpos]);
}
return retval;
}
template <class T> bool CSortAlgorithm<T>::InsertSort(T elements[], t_length length)
{
bool retval = true;
for(t_pos i=0; i<(length-1); i++)
{
for(signed long long k=i; k>=0; k--) //wichitg!!! signed typ als Zaehlervarialble
{
if(k<0)break; //geht doch ohne vorsortieren :-)
if(elements[k]>elements[k+1])
{
CSortAlgorithm<T>::swap(elements[k], elements[k+1]);
}
}
}
return retval;
}
template <class T> bool CSortAlgorithm<T>::BubbleSort(T elements[], t_length length)
{
bool retval = true;
bool hasChanged=true;
while(hasChanged)
{
hasChanged = false;
for(t_pos i = 0; i<(length-1); i++)
{
if( elements[i] > elements[i+1] )
{
CSortAlgorithm<T>::swap(elements[i], elements[i+1]);
hasChanged = true;
}
}
}
return retval;
}
template <class T> bool CSortAlgorithm<T>::QuickSort(T elements[], t_length lenght)
{
bool retval = true;
CSortAlgorithm<T>::QuickSort(elements, 0, lenght-1);
return retval;
}
template <class T> bool CSortAlgorithm<T>::QuickSort(T elements[], t_pos left, t_pos right)
{
bool retval = true;
if(left<right)
{
T pivot = elements[right];
t_pos il = left;
t_pos ir = right-1;
while(true)
{
while(elements[il] < pivot)il++;
while(elements[ir] > pivot && il < ir )ir--;
if(il>=ir)break;
CSortAlgorithm<T>::swap(elements[il], elements[ir]);
}
CSortAlgorithm<T>::swap(elements[right], elements[ir]);
CSortAlgorithm<T>::QuickSort(elements, left, il-1);
CSortAlgorithm<T>::QuickSort(elements, ir+1, right);
}
return retval;
}
//----------------------------------------------------------------------------------------/
//----------------------------------------------------------------------------------------|
int main()
{
int a[] = {5,1,3,9,6,5,7,2,10,11,4,};
//int a[] = {5,1,3,1,3,6,45,23,54,55,52,9,6,5,7,2,10,11,4,};
for( int i=0; i<(sizeof(a)/4); i++)
{
cout<<(sizeof(a)/4)<<"before sort: "<<a[i]<<endl;
}
CSortAlgorithm<int>::QuickSort(a, sizeof(a)/4);
for( int i=0; i<(sizeof(a)/4); i++)
{
cout<<(sizeof(a)/4)<<"after sort: "<<a[i]<<endl;
}
cin.get();
return 0;
}
Lesezeichen