排序
2012-04-09 15:46 Rollen Holt 阅读(1088) 评论(3) 编辑 收藏 举报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; }
==============================================================================
本博客已经废弃,不在维护。新博客地址:http://wenchao.ren
我喜欢程序员,他们单纯、固执、容易体会到成就感;面对压力,能够挑灯夜战不眠不休;面对困难,能够迎难而上挑战自我。他
们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。我想说的是,其
实我是一个程序员
==============================================================================