Data.h
template<typename Type> class Element{
public:
Type GetKey(){
return key;
}
void SetKey(Type item){
key = item;
}
public:
Element<Type>& operator =(Element<Type> copy){
key = copy.key;
return *this;
}
bool operator ==(Element<Type> item){
return this->key == item.key;
}
bool operator !=(Element<Type> item){
return this->key != item.key;
}
bool operator <(Element<Type> item){
return this->key < item.key;
}
bool operator >(Element<Type> item){
return this->key > item.key;
}
bool operator >=(Element<Type> item){
return this->key >= item.key;
}
bool operator <=(Element<Type> item){
return this->key <= item.key;
}
private:
Type key;
};
template<typename Type> class Sort;
template<typename Type> class DataList{
public:
friend class Sort<Type>;
DataList(int size=m_nDefaultSize): m_nMaxSize(size), m_ncurrentsize(0){
m_pvector = new Element<Type>[size];
}
DataList(Type *data, int size);
bool Insert(Type item);
~DataList(){
delete[] m_pvector;
}
int Size(){
return this->m_ncurrentsize;
}
void Swap(Element<Type> &left, Element<Type> &right){
Element<Type> temp = left;
left = right;
right = temp;
}
void Print();
private:
static const int m_nDefaultSize = 10;
Element<Type> *m_pvector;
const int m_nMaxSize;
int m_ncurrentsize;
};
template<typename Type> DataList<Type>::DataList(Type *data, int size)
: m_nMaxSize(size > m_nDefaultSize ? size : m_nDefaultSize), m_ncurrentsize(0){
this->m_pvector = new Element<Type>[size];
for (int i=0; i<size; i++){
this->m_pvector[i].SetKey(data[i]);
}
this->m_ncurrentsize += size;
}
template<typename Type> bool DataList<Type>::Insert(Type item){
if (this->m_ncurrentsize == this->m_nMaxSize){
cerr << "The list is full!" <<endl;
return 0;
}
this->m_pvector[this->m_ncurrentsize++].SetKey(item);
}
template<typename Type> void DataList<Type>::Print(){
cout << "The list is:";
for (int i=0; i<this->m_ncurrentsize; i++){
cout << " " << this->m_pvector[i].GetKey();
}
}
QueueNode.h
template<typename Type> class LinkQueue;
template<typename Type> class QueueNode{
private:
friend class LinkQueue<Type>;
QueueNode(const Type item,QueueNode<Type> *next=NULL)
:m_data(item),m_pnext(next){}
private:
Type m_data;
QueueNode<Type> *m_pnext;
};
LinkQueue.h
#include "QueueNode.h"
template<typename Type> class LinkQueue{
public:
LinkQueue():m_prear(NULL),m_pfront(NULL){}
~LinkQueue(){
MakeEmpty();
}
void Append(const Type item);
Type Delete();
Type GetFront();
void MakeEmpty();
bool IsEmpty() const{
return m_pfront==NULL;
}
void Print();
private:
QueueNode<Type> *m_prear,*m_pfront;
};
template<typename Type> void LinkQueue<Type>::MakeEmpty(){
QueueNode<Type> *pdel;
while(m_pfront){
pdel=m_pfront;
m_pfront=m_pfront->m_pnext;
delete pdel;
}
}
template<typename Type> void LinkQueue<Type>::Append(const Type item){
if(m_pfront==NULL){
m_pfront=m_prear=new QueueNode<Type>(item);
}
else{
m_prear=m_prear->m_pnext=new QueueNode<Type>(item);
}
}
template<typename Type> Type LinkQueue<Type>::Delete(){
if(IsEmpty()){
cout<<"There is no element!"<<endl;
exit(1);
}
QueueNode<Type> *pdel=m_pfront;
Type temp=m_pfront->m_data;
m_pfront=m_pfront->m_pnext;
delete pdel;
return temp;
}
template<typename Type> Type LinkQueue<Type>::GetFront(){
if(IsEmpty()){
cout<<"There is no element!"<<endl;
exit(1);
}
return m_pfront->m_data;
}
template<typename Type> void LinkQueue<Type>::Print(){
QueueNode<Type> *pmove=m_pfront;
cout<<"front";
while(pmove){
cout<<"--->"<<pmove->m_data;
pmove=pmove->m_pnext;
}
cout<<"--->rear"<<endl<<endl<<endl;
}
Sort.h
#include "Data.h"
#include "LinkQueue.h"
template<typename Type> class Sort{
public:
void InsertSort(DataList<Type> &list, int n=-1);
void BinaryInsertSort(DataList<Type> &list, int n=-1);
void ShellSort(DataList<Type> &list, const int gap=-1);
void BubbleSort(DataList<Type> &list);
void QuickSort(DataList<Type> &list, int left=0, int right=-3);
void SelectSort(DataList<Type> &list);
void HeapSort(DataList<Type> &list);
void MergeSort(DataList<Type> &list);
void RadixSort(DataList<int> &list, int m, int d); //just use for integer!
private:
void BubbleSwap(DataList<Type> &list, const int n, int &flag);
void SelectChange(DataList<Type> &list, const int n);
void HeapAdjust(DataList<Type> &list, const int start, const int end);
void Merge(DataList<Type> &list, DataList<Type> &mergedlist, const int len);
void MergeDouble(DataList<Type> &list, DataList<Type> &mergedlist, const int start, const int part, const int end);
};
template<typename Type> void Sort<Type>::InsertSort(DataList<Type> &list, int n){
if (-1 == n){
for (int i=1; i<list.m_ncurrentsize; i++){
InsertSort(list, i);
}
return;
}
Element<Type> temp = list.m_pvector[n];
int i;
for (i=n; i>0; i--){
if (temp > list.m_pvector[i-1]){
break;
}
else{
list.m_pvector[i] = list.m_pvector[i-1];
}
}
list.m_pvector[i] = temp;
}
template<typename Type> void Sort<Type>::BinaryInsertSort(DataList<Type> &list, int n){
if (-1 == n){
for (int i=1; i<list.m_ncurrentsize; i++){
BinaryInsertSort(list, i);
}
return;
}
Element<Type> temp = list.m_pvector[n];
int left = 0, right = n-1;
while(left <= right){
int middle = (left + right) / 2;
if (temp < list.m_pvector[middle]){
right = middle - 1;
}
else {
left = middle + 1;
}
}
for (int i=n-1; i>=left; i--){
list.m_pvector[i+1] = list.m_pvector[i];
}
list.m_pvector[left] = temp;
}
template<typename Type> void Sort<Type>::ShellSort(DataList<Type> &list, const int gap){
if (-1 == gap){
int gap = list.m_ncurrentsize / 2;
while (gap){
ShellSort(list, gap);
gap = (int)(gap / 2);
}
return;
}
for (int i=gap; i<list.m_ncurrentsize; i++){
InsertSort(list, i);
}
}
template<typename Type> void Sort<Type>::BubbleSwap(DataList<Type> &list, const int n, int &flag){
flag = 0;
for (int i=list.m_ncurrentsize-1; i>=n; i--){
if (list.m_pvector[i-1] > list.m_pvector[i]){
list.Swap(list.m_pvector[i-1], list.m_pvector[i]);
flag = 1;
}
}
}
template<typename Type> void Sort<Type>::BubbleSort(DataList<Type> &list){
int flag = 1, n = 0;
while (++n<list.m_ncurrentsize && flag){
BubbleSwap(list, n, flag);
}
}
template<typename Type> void Sort<Type>::QuickSort(DataList<Type> &list, int left=0, int right=-1){
if (-3 == right){
right = list.m_ncurrentsize - 1;
}
if (left < right){
int pivotpos = left;
Element<Type> pivot = list.m_pvector[left];
for (int i=left+1; i<=right; i++){
if (list.m_pvector[i]<pivot && ++pivotpos!=i){
list.Swap(list.m_pvector[pivotpos], list.m_pvector[i]);
}
list.Swap(list.m_pvector[left], list.m_pvector[pivotpos]);
}
QuickSort(list, left, pivotpos-1);
QuickSort(list, pivotpos+1, right);
}
}
template<typename Type> void Sort<Type>::SelectChange(DataList<Type> &list, const int n){
int j = n;
for (int i=n+1; i<list.m_ncurrentsize; i++){
if (list.m_pvector[i] < list.m_pvector[j]){
j = i;
}
}
if (j != n){
list.Swap(list.m_pvector[n], list.m_pvector[j]);
}
}
template<typename Type> void Sort<Type>::SelectSort(DataList<Type> &list){
for (int i=0; i<list.m_ncurrentsize-1; i++){
SelectChange(list, i);
}
}
template<typename Type> void Sort<Type>::HeapAdjust(DataList<Type> &list, const int start, const int end){
int current = start, child = 2 * current + 1;
Element<Type> temp = list.m_pvector[start];
while (child <= end){
if (child<end && list.m_pvector[child]<list.m_pvector[child+1]){
child++;
}
if (temp >= list.m_pvector[child]){
break;
}
else {
list.m_pvector[current] = list.m_pvector[child];
current = child;
child = 2 * current + 1;
}
}
list.m_pvector[current] = temp;
}
template<typename Type> void Sort<Type>::HeapSort(DataList<Type> &list){
for (int i=(list.m_ncurrentsize-2)/2; i>=0; i--){
HeapAdjust(list, i, list.m_ncurrentsize-1);
}
for (int i=list.m_ncurrentsize-1; i>=1; i--){
list.Swap(list.m_pvector[0], list.m_pvector[i]);
HeapAdjust(list, 0, i-1);
}
}
template<typename Type> void Sort<Type>::MergeDouble(DataList<Type> &list, DataList<Type> &mergedlist, const int start, const int part, const int end){
int i = start, j = part + 1, k = start;
while (i<=part && j<=end){
if (list.m_pvector[i] <= list.m_pvector[j]){
mergedlist.m_pvector[k++] = list.m_pvector[i++];
}
else {
mergedlist.m_pvector[k++] = list.m_pvector[j++];
}
}
if (i <= part){
for (int m=i; m<=part && k<=end;){
mergedlist.m_pvector[k++] = list.m_pvector[m++];
}
}
else {
for (int m=j; m<=end && k<=end; m++){
mergedlist.m_pvector[k++] = list.m_pvector[m];
}
}
}
template<typename Type> void Sort<Type>::Merge(DataList<Type> &list, DataList<Type> &mergedlist, const int len){
int n = 0;
while (n+2*len < list.m_ncurrentsize){
MergeDouble(list, mergedlist, n, n+len-1, n+2*len-1);
n += 2*len;
}
if (n+len < list.m_ncurrentsize){
MergeDouble(list, mergedlist, n, n+len-1, list.m_ncurrentsize-1);
}
else {
for (int i=n; i<list.m_ncurrentsize; i++){
mergedlist.m_pvector[i] = list.m_pvector[i];
}
}
}
template<typename Type> void Sort<Type>::MergeSort(DataList<Type> &list){
DataList<Type> temp(list.m_nMaxSize);
temp.m_ncurrentsize = list.m_ncurrentsize;
int len = 1;
while (len < list.m_ncurrentsize){
Merge(list, temp, len);
len *= 2;
Merge(temp, list, len);
len *= 2;
}
}
template<typename Type> void Sort<Type>::RadixSort(DataList<int> &list, int m, int d){
LinkQueue<int> *queue = new LinkQueue<int>[d];
int power = 1;
for (int i=0; i<m; i++){
if (i){
power = power * d;
}
for (int j=0; j<list.m_ncurrentsize; j++){
int k = (list.m_pvector[j].GetKey() / power) % d;
queue[k].Append(list.m_pvector[j].GetKey());
}
for (int j=0,k=0; j<d; j++){
while (!queue[j].IsEmpty()){
list.m_pvector[k++].SetKey(queue[j].Delete());
}
}
}
}
test.cpp
#include <iostream>
using namespace std;
#include "Sort.h"
int main(){
int init[15]={1,3,5,7,4,2,8,0,6,9,29,13,25,11,32};
DataList<int> data(init, 15);
Sort<int> sort;
data.Print();
cout << endl << endl <<endl;
sort.InsertSort(data);
sort.BinaryInsertSort(data);
sort.ShellSort(data);
sort.BubbleSort(data);
sort.QuickSort(data);
sort.SelectSort(data);
sort.HeapSort(data);
sort.MergeSort(data);
sort.RadixSort(data, 2, 10);
data.Print();
return 0;
}
