今天,我们一起用C++写一个冒泡排序,目的就是通过不断地实践来熟练C++,具体代码如下:
Data.h具体内容:
templateLinkQueue.h具体内容:class Element{public: Type GetKey(){ return key; } void SetKey(Type item){ key = item; }public: Element & operator =(Element copy){ key = copy.key; return *this; } bool operator ==(Element item){ return this->key == item.key; } bool operator !=(Element item){ return this->key != item.key; } bool operator <(Element item){ return this->key < item.key; } bool operator >(Element item){ return this->key > item.key; } bool operator >=(Element item){ return this->key >= item.key; } bool operator <=(Element item){ return this->key <= item.key; }private: Type key;};template class Sort;template class DataList{public: friend class Sort < Type > ; DataList(int size = m_nDefaultSize) : m_nMaxSize(size), m_ncurrentsize(0){ m_pvector = new Element [size]; } DataList(Type *data, int size); bool Insert(Type item); ~DataList(){ delete[] m_pvector; } int Size(){ return this->m_ncurrentsize; } void Swap(Element &left, Element &right){ Element temp = left; left = right; right = temp; } void Print();private: static const int m_nDefaultSize = 10; Element *m_pvector; const int m_nMaxSize; int m_ncurrentsize;};template DataList ::DataList(Type *data, int size) : m_nMaxSize(size > m_nDefaultSize ? size : m_nDefaultSize), m_ncurrentsize(0){ this->m_pvector = new Element [size]; for (int i = 0; i < size; i++){ this->m_pvector[i].SetKey(data[i]); } this->m_ncurrentsize += size;}template bool DataList ::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 void DataList ::Print(){ cout << "The list is:"; for (int i = 0; i < this->m_ncurrentsize; i++){ cout << " " << this->m_pvector[i].GetKey(); }}
#include "QueueNode.h"templateQueueNode.h具体内容: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 *m_prear, *m_pfront;};template void LinkQueue ::MakeEmpty(){ QueueNode *pdel; while (m_pfront){ pdel = m_pfront; m_pfront = m_pfront->m_pnext; delete pdel; }}template void LinkQueue ::Append(const Type item){ if (m_pfront == NULL){ m_pfront = m_prear = new QueueNode (item); } else{ m_prear = m_prear->m_pnext = new QueueNode (item); }}template Type LinkQueue ::Delete(){ if (IsEmpty()){ cout << "There is no element!" << endl; exit(1); } QueueNode *pdel = m_pfront; Type temp = m_pfront->m_data; m_pfront = m_pfront->m_pnext; delete pdel; return temp;}template Type LinkQueue ::GetFront(){ if (IsEmpty()){ cout << "There is no element!" << endl; exit(1); } return m_pfront->m_data;}template void LinkQueue ::Print(){ QueueNode *pmove = m_pfront; cout << "front"; while (pmove){ cout << "--->" << pmove->m_data; pmove = pmove->m_pnext; } cout << "--->rear" << endl << endl << endl;}
templateSort.h具体内容如下:class LinkQueue;template class QueueNode{private: friend class LinkQueue < Type > ; QueueNode(const Type item, QueueNode *next = NULL) :m_data(item), m_pnext(next){}private: Type m_data; QueueNode *m_pnext;};
#include "Data.h"#include "LinkQueue.h"templatemain.cpp具体内容如下:class Sort{public: void BubbleSort(DataList &list);private: void BubbleSwap(DataList &list, const int n, int &flag);};
#include运行效果如图1所示: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 data(init, 15); Sort sort; data.Print(); cout << endl << endl << endl; sort.BubbleSort(data); data.Print(); cin.get(); return 0;}
图1 运行效果