排序(程序)

来源:互联网 发布:八大处 知乎 编辑:程序博客网 时间:2024/05/18 01:59

QueueNode.h

template<typename Type,typename Cmp>class PriorityQueue;template<typename Type, typename Cmp>class QueueNode{friend class PriorityQueue<Type, Cmp>;QueueNode(const Type item, QueueNode<Type,Cmp> *next = NULL):m_data(item),m_pnext(next){}private:Type m_data;QueueNode<Type,Cmp> *m_pnext;};


Compare.h

template<typename Type> class Compare{public:static bool lt(Type item1, Type item2);};template<typename Type> bool Compare<Type>::lt(Type item1, Type item2){return item1 < item2;}struct SpecialData{friend ostream& operator<<(ostream&, SpecialData &);int m_ntenor;int m_npir;};ostream& operator<<(ostream& os, SpecialData& out){os<<out.m_ntenor<<" "<<out.m_npir;return os;}class SpecialCmp{public:static bool lt(SpecialData item1, SpecialData item2);};bool SpecialCmp::lt(SpecialData item1, SpecialData item2){return item1.m_npir < item2.m_npir;}


PriorityQueue.h

#include "QueueNode.h"#include "Compare.h"template<typename Type,typename Cmp> class PriorityQueue{private:QueueNode<Type,Cmp> *m_prear, *m_pfront;public:PriorityQueue():m_prear(NULL),m_pfront(NULL){}~PriorityQueue(){MakeEmpty();}void MakeEmpty();void Append(const Type item);Type Delete();Type GetFront();void Print();bool IsEmpty(){return m_pfront==NULL;}};


PriorityQueue.cpp

template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::MakeEmpty(){ QueueNode<Type,Cmp> *p = m_pfront; while(m_pfront != NULL) { p = m_pfront; m_pfront = m_pfront->m_pnext; delete p; } m_prear = NULL;}template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Append(const Type item){QueueNode<Type,Cmp> *p = new QueueNode<Type,Cmp>(item, NULL);if(IsEmpty()){m_pfront = p;m_prear = p;}else{m_prear->m_pnext = p;m_prear = p;}}template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::Delete(){if(IsEmpty()){cout<<"There is no elements!"<<endl;exit(1);}QueueNode<Type,Cmp> *p = m_pfront, *q = m_pfront;while(p->m_pnext != NULL){if(Cmp::lt(p->m_pnext->m_data,q->m_pnext->m_data))q = p;p = p->m_pnext;}p = q;q = q->m_pnext;Type temp = q->m_data;p->m_pnext = q->m_pnext;delete q;return temp;}template<typename Type,typename Cmp> Type PriorityQueue<Type,Cmp>::GetFront(){if(IsEmpty()){cout<<"There is no elements!"<<endl;exit(1);}QueueNode<Type,Cmp> *p = m_pfront, *q = m_pfront;while(p->m_pnext != NULL){if(Cmp::lt(p->m_pnext->m_data,q->m_pnext->m_data))q = p;p = p->m_pnext;}return q->m_pnext->m_data;}template<typename Type,typename Cmp> void PriorityQueue<Type,Cmp>::Print(){QueueNode<Type,Cmp> *p = m_pfront, *q = m_pfront;while(p != NULL){cout<<p->m_data<<' ';p = p->m_pnext;}cout<<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, int n = -1);void BubbleSort(DataList<Type> &list);void QuickSort(DataList<Type> &list, int left=0, int right=-1);void SelectSort(DataList<Type> &list);void HeapSort(DataList<Type> &list);void MergeSort(DataList<Type> &list);void RadixSort(DataList<int> &list, int m, int d);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, int start, int end);    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.Size(); 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;elselist.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.Size(); 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.Size() / 2;while(gap){ShellSort(list,gap);gap = gap / 2;}return ;}int i,j;for(i = gap; i < list.Size(); i++){Element<Type> temp = list.m_pvector[i];if(temp < list.m_pvector[i-gap]){for(j = i - gap; j >=0 && temp < list.m_pvector[j]; j-=gap)list.m_pvector[j+gap] = list.m_pvector[j];list.m_pvector[j+gap] = temp;}}}template<typename Type> void Sort<Type>::BubbleSwap(DataList<Type> &list, const int n, int &flag){flag = 0;for(int i = list.Size() - 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.Size() && flag)BubbleSwap(list, n, flag);}template<typename Type> void Sort<Type>::QuickSort(DataList<Type> &list, int left=0, int right=-1){if(-1 == right)right = list.Size() -1 ;int a = left, b = right;if(left < right){int pos = left;Element<Type>temp = list.m_pvector[left];while(left < right){while(left < right && list.m_pvector[right] >= temp)--right;list.m_pvector[left] = list.m_pvector[right];while(left < right && list.m_pvector[left] <= temp)++left;list.m_pvector[right] = list.m_pvector[left];}list.m_pvector[left] = temp;QuickSort(list, a, left - 1);QuickSort(list, left + 1, b);}}template<typename Type> void Sort<Type>::SelectChange(DataList<Type> &list, const int n){int j = n;for(int i = n + 1; i < list.Size(); 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.Size()-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.Size()-2)/2; i >= 0; i--)HeapAdjust(list, i, list.Size() - 1);for(int i = list.Size() - 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, int start, int part, int end){int j, k;for(j = part+1,k=start; start <= part&&j<=end; ++k){if(list.m_pvector[start] < list.m_pvector[j])mergedlist.m_pvector[k] = list.m_pvector[start++];elsemergedlist.m_pvector[k] = list.m_pvector[j++];}if(start <= part){int i1,i2;for(i1=k,i2=start; i1<=end,i2<=part; i1++,i2++)mergedlist.m_pvector[i1] = list.m_pvector[i2];}if(j <= end){int i1,i2;for(i1=k,i2=j; i1<=end,i2<=end; i1++,i2++)mergedlist.m_pvector[i1] = list.m_pvector[i2];}}template<typename Type> void Sort<Type>::Merge(DataList<Type> &list, DataList<Type> &mergedlist, int start, int end){if(start == end)mergedlist.m_pvector[start] = list.m_pvector[start];else{DataList<Type> temp(list.m_pvector,list.m_nMaxSize);int m = (start + end) / 2;Merge(list, temp, start, m);Merge(list, temp, m + 1, end);MergeDouble(temp, mergedlist, start, m, end);}}template<typename Type> void Sort<Type>::MergeSort(DataList<Type> &list){Merge(list, list, 0, list.Size() - 1);}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>#include <cstdlib>using namespace std;#include "PriorityQueue.h"#include "Sort.h"int main(){PriorityQueue<int,Compare<int> > queue;int init[10]={1,9,3,5,0,8,2,4,6,7};for(int i=0;i<10;i++){queue.Append(init[i]);}queue.Print();queue.Delete();queue.Print();system("pause");system("cls");PriorityQueue<SpecialData,SpecialCmp> spe_queue;int init2[5][2]={{34,2},{64,1},{18,3},{24,2},{55,4}};SpecialData data[5];for(int i=0;i<5;i++){data[i].m_npir=init2[i][1];data[i].m_ntenor=init2[i][0];}for(int i=0;i<5;i++){spe_queue.Append(data[i]);}spe_queue.Print();    cout<<spe_queue.GetFront()<<endl<<endl;spe_queue.Delete();spe_queue.Print();return 0;}


原创粉丝点击