1、1 排序算法1.1 冒泡排序/*函数功能:对数组中的某一部分进行冒泡排序。函数原形:void BubSort(DataType a, int l, int r, bool Up=true);参数:DataType a:欲排序的数组;int l:有序序列在数组中的起始位置;int r:有序序列在数组中的结束位置;bool Up:true按升序排列,false按降序排列。返回值:无。备注:无。*/template void BubSort(DataType a, int l, int r, bool Up=true)int i,j;DataType k;if (Up)for (i=l;i=i+1;
2、j-)if (aj-1aj)k=aj-1;aj-1=aj;aj=k;elsefor (i=l;i=i+1;j-)if (aj-1aj)k=aj-1;aj-1=aj;aj=k;1.2 选择排序/*函数功能:对数组中的某一部分进行选择排序。函数原形:void SelectSort(DataType a, int l, int r, bool Up=true);参数:DataType a:欲排序的数组;int l:有序序列在数组中的起始位置;int r:有序序列在数组中的结束位置;bool Up:true按升序排列,false按降序排列。返回值:无。备注:无。*/*普通版*/template voi
3、d SelectSort(DataType a, int l, int r, bool Up=true)int i,j;DataType k;if (Up)for (i=l;i=r-1;i+)for (j=i+1;jaj)k=ai;ai=aj;aj=k;elsefor (i=l;i=r-1;i+)for (j=i+1;j=r;j+)if (aiaj)k=ai;ai=aj;aj=k;/*优化版*/template void SelectSort(DataType a, int l, int r, bool Up=true)int i,j,k;DataType x;if (Up)for (i=l;
4、i=r-1;i+)k=i;for (j=i+1;j=r;j+)if (ajak) k=j;x=ai;ai=ak;ak=x;elsefor (i=l;i=r-1;i+)k=i;for (j=i+1;jak) k=j;x=ai;ai=ak;ak=x;1.3 插入排序/*函数功能:向有序数组中插如元素,并使插入新元素后仍然有序。函数原形:void InsertSort(DataType s, int &Count, DataType x, bool Up=true);参数:DataType s:欲插入元素的有序序列;int &Count:有序序列中现有元素个数;DataType x:欲插入的元素;b
5、ool Up:true按升序排列,false按降序排列。返回值:无。备注:无。*/template void InsertSort(DataType s, int &Count, DataType x, bool Up=true)int i,k=-1;if (Up)for (i=0;i=Count-1;i+)if (xsi)k=i;break;elsefor (i=0;isi)k=i;break;if (k=-1) s+Count-1=x;elsefor (i=Count-1;i=k;i-) si+1=si;sk=x;Count+;1.4 快速排序/*函数功能:对数组中的某一部分进行快速排序。
6、函数原形:void QuickSort(DataType a, int l, int r, bool Up=true);参数:DataType a:欲排序的数组;int l:有序序列在数组中的起始位置;int r:有序序列在数组中的结束位置;bool Up:true按升序排列,false按降序排列。返回值:无。备注:无。*/template void QuickSort(DataType a, int l, int r, bool Up=true)int i,j;DataType Mid,k;i=l;j=r;Mid=a(l+r)/2;if (Up)dowhile (aiMid) +i;whil
7、e (Midaj) -j;if (i=j)k=ai;ai=aj;aj=k;+i;-j; while (iMid) +i;while (Midaj) -j;if (i=j)k=ai;ai=aj;aj=k;+i;-j; while (i=j);if (ir) QuickSort(a,i,r,Up);if (lj) QuickSort(a,l,j,Up);1.5 哈希排序/*函数功能:对数组中的某一部分进行哈希排序。函数原形:void QuickSort(DataType a, int l, int r, bool Up=true);参数:DataType a:欲排序的数组;int l:有序序列在数
8、组中的起始位置;int r:有序序列在数组中的结束位置;bool Up:true按升序排列,false按降序排列。返回值:无。备注:只能对032767范围内的整数排序。*/void HashSort(int a, int l, int r, bool Up=true)int i,j,k,Hash32767=0;for (i=l;i=r;i+) Hashai+;k=l;if (Up)for (i=0;i=32767-1;i+)for (j=1;jr) break;elsefor (i=32767-1;i=0;i-)for (j=1;jr) break;2 数学问题2.1 求最大公约数最小公倍数/
9、*函数功能:求两数的最大公约数。函数原形:int GCD(int m, int n);参数:int m, int n:求这两个数的最大公约数。返回值:int型,m、n的最大公约数。备注:最小公倍数=m*n/GCD(m,n)。*/int GCD(int m, int n)int Temp,x,y;x=m;y=n;Temp=x%y;while (Temp!=0)x=y;y=Temp;Temp=x%y;return y;2.2 求素数2.2.1 穷举法/*函数功能:判断一个数是否是素数。函数原形:bool Prime(int x);参数:int x:欲判断的数。返回值:bool型,返回true表示x
10、是素数,返回false表示x不是素数。备注:需包含头文件。*/bool Prime(int x)int i;x=abs(x);if (x=1) return false;for (i=2;i=int(sqrt(float(x);i+)if (x%i=0) return false;return true;2.2.2筛法/*函数功能:判断小于等于n的数是否是素数。函数原形:void Prime(bool Hash, int n);参数:bool Hash:最终结果,Hashi=true表示i是素数,否则表示i不是素数;int n:判断范围。返回值:无。备注:无。*/void Prime(bool
11、 Hash, int n)int i,k;Hash0=false;Hash1=false;for (i=2;i=n;i+) Hashi=true;i=2;while (i=n/2)k=i;while (k+i=n)k=k+i;Hashk=false;i+;while (Hashi=false & in) i+;2.3 排列组合2.3.1 排列数/*函数功能:排列数公式A(m,n)。函数原形:int A(int m, int n);参数:int m, int n:排列数公式的两个参数。返回值:int 型,排列数。备注:无。*/int A(int m, int n)int i,Ans;Ans=1;
12、for (i=1;i=m;i+)Ans=Ans*n;n-;return Ans;2.3.2 组合数/*函数功能:组合数公式C(m,n)。函数原形:int C(int m, int n);参数:int m, int n:组合数公式的两个参数。返回值:int 型,组合数。备注:无。*/int C(int m, int n)int i,Ans;Ans=1;for (i=1;i=m;i+)Ans=Ans*n;n-;for (i=2;i=m;i+) Ans=Ans/i;return Ans;2.3.3 全排列算法/*函数功能:输出n的全排列。函数原形:void Arrange(int n);参数:int
13、 n:全排列元素个数。返回值:无。备注:无。*/void Swap(int &a, int &b)int k;k=a;a=b;b=k;void Inverse(int Num, int l, int r)int i,Count;Count=(r-l+1)/2;for (i=1;i=Count;i+) Swap(Numl+,Numr-);void Arrange(int n)int *Num=new intn+1;char i,x,y;Num0=0;for (i=1;i=n;i+) /输出原始序列Numi=i;coutNumi ;coutn;dofor (i=1;iNumi-1) x=i;for
14、 (i=x;iNumx-1) y=i;if (x1)Swap(Numx-1,Numy); /交换Numx-1和NumyInverse(Num,x,n); /对numxnumn作逆序处理for (i=1;i=n;i+) coutNumi ; /输出当前序列coutn; while(x!=1);delete Num;2.3.4 从n个数中选m个的组合/*函数功能:输出n选m的组合方案。函数原形:void Combination(int m, int n);参数:int m:欲选出的元素个数;int n:元素总个数。返回值:无。备注:无。*/void Combination(int m, int n
15、)int *a=new intn+1,i,j;a0=1;for (i=1;i=m;i+) ai=i;while (a0=1)for (i=1;i=m;i+) coutai ; /输出当前序列cout0) j-;aj+;for (i=j+1;i=n;i+) ai=ai-1+1;delete a;2.4 进制转换2.4.1 十进制转N进制/*函数功能:将一个十进制数转换成一个N进制数。函数原形:string DecToN(DataType x, int n);参数: DataType x:欲转换的数; int n:返回结果的进制。返回值:string类对象,转换结果。备注:需包含。*/templa
16、te string DecToN(DataType x, int n)string Ans;int Count,i,j=0,a64;Count=0;if (x=0)Ans0=0;Ans1=0;elsewhile (x0)aCount+=x%n;x=x/n;for (i=Count-1;i=0;i-)if (ai10) Ans.append(1,ai+0);else Ans.append(1,ai+A-10);return Ans;2.4.2 N进制转十进制/*函数功能:将一个N进制数转换成一个十进制数。函数原形:long NToDec(string x, int n);参数: string x
17、:欲转换的数; int n:被转换数的进制。返回值:long型,转换结果。备注:需包含、。*/long NToDec(string x, int n)int a32,y,Count,i,j;long Ans;Ans=0;for (i=0;i=(int)x.length()-1;i+)if (0=xi & xi=0;i-)y=1;for (j=1;j=Count;j+) y=y*n;Count+;Ans=Ans+y*ai;return Ans;3 查找3.1 二分查找/*函数功能:查找指定元素在数组中的位置。函数原形:int BinarySearch(DataType a, DataType x
18、, int l, int r);参数: DataType a:目标数组;DataType x:待查找的元素;int l:数组下标上限;int r:数组下标下限。返回值:int型,元素x在数组a中的下标。备注:无。*/template int BinarySearch(DataType a, DataType x, int l, int r)int Mid;while (l=r)Mid=(l+r)/2;if (x=aMid) return Mid;elseif (xaMid) l=Mid+1;return -1;4 栈4.1 栈的定义template class StackClassprivat
19、e:struct BodyNodeStructDataType Data;BodyNodeStruct *Pre,*Next; Bottom,*Top;public:StackClass(); /构造函数,创建一个空栈bool Empty(); /判断栈是否为空,若为空则返回true,否则返回falseint Push(DataType Data); /将Data压栈,如果压栈成功则返回0,否则返回1int Pop(DataType &Data); /弹出栈顶元素,保存在Data中,若栈不为空则返回0,否则返回1int GetTop(DataType &Data); /读取栈顶元素,保存在Da
20、ta中,若栈不为空则返回0,否则返回1int Size(); /返回栈中元素个数void Clear(); /清空栈StackClass(); /析构函数 ;template StackClass:StackClass()Top=&Bottom;Top-Pre=NULL;Top-Next=NULL;template bool StackClass:Empty()if (Top=&Bottom) return true;else return false;template int StackClass:Push(DataType Data)BodyNodeStruct *Temp=new Bod
21、yNodeStruct;if (Temp!=NULL)Temp-Pre=Top;Temp-Next=NULL;Top-Next=Temp;Top-Data=Data;Top=Temp;return 0;else return 1;template int StackClass:Pop(DataType &Data)if (!Empty()Top=Top-Pre;Data=Top-Data;delete Top-Next;Top-Next=NULL;return 0;else return 1;template int StackClass:GetTop(DataType &Data)if (!
22、Empty()Data=Top-Pre-Data;return 0;else return 1;template int StackClass:Size()BodyNodeStruct *Temp=&Bottom;int Count=0;while (Temp!=Top)Count+;Temp=Temp-Next;return Count;template void StackClass:Clear()DataType Temp;while (!Empty() Pop(Temp);template StackClass:StackClass()Clear();4.2 表达式求值/*函数功能:计
23、算四则运算表达式的值。函数原形:long Evaluate(string Exp);参数: string Exp:欲求值的四则运算表达式。返回值:long型,表达式的值。备注:需包含。*/long Evaluate(string Exp)StackClass Optr;StackClass Opnd;long a,b,Ans;int TempOptr,x,i,Length,Operator77=2,2,0,0,0,2,2,2,2,0,0,0,2,2,2,2,2,2,0,2,2,2,2,2,2,0,2,2,0,0,0,0,0,1,-1,2,2,2,2,-1,2,2,0,0,0,0,0,-1,1;
24、char TempOpnd6;Optr.Push(6);Opnd.Push(0);Length=0;i=0;Optr.GetTop(x);while (Expi!= | x!=6)if (48=Expi & Expi0)TempOpndLength=0;Length=0;Opnd.Push(atoi(TempOpnd);switch (Expi)case +:TempOptr=0;break;case -:TempOptr=1;break;case *:TempOptr=2;break;case /:TempOptr=3;break;case (:TempOptr=4;break;case )
25、:TempOptr=5;break;case =:TempOptr=6;break;Optr.GetTop(x);switch (OperatorxTempOptr)case 0:Optr.Push(TempOptr);i+;break;case 1:Optr.Pop(x);i+;break;case 2:Optr.Pop(TempOptr);Opnd.Pop(b);Opnd.Pop(a);switch (TempOptr)case 0:Opnd.Push(a+b);break;case 1:Opnd.Push(a-b);break;case 2:Opnd.Push(a*b);break;ca
26、se 3:Opnd.Push(a/b);break;break;Optr.GetTop(x);Opnd.Pop(Ans);return Ans;5 队列5.1 队列的定义template class QueueClassprivate:struct BodyNodeStructDataType Data;BodyNodeStruct *Pre,*Next; *Front,*Rear;public:QueueClass(); /构造函数,构造一个空队列bool Empty(); /判断队列是否为空,若为空则返回true,否则返回falseint Push(DataType Data); /将Da
27、ta压入队尾,如果压入成功则返回0,否则返回1int Pop(DataType &Data); /弹出队头元素,保存在Data中,若队列不为空则返回0,否则返回1int GetFront(DataType &Data); /读取队头元素,保存在Data中,若队列不为空则返回0,否则返回1int Size(); /返回队列中元素个数void Clear(); /清空队列QueueClass(); /析构函数 ;template QueueClass:QueueClass()Front=new BodyNodeStruct;Front-Pre=NULL;Front-Next=NULL;Rear=F
28、ront;template bool QueueClass:Empty()if (Front=Rear) return true;else return false;template int QueueClass:Push(DataType Data)BodyNodeStruct *Temp=new BodyNodeStruct;if (Temp!=NULL)Temp-Pre=Rear;Temp-Next=NULL;Rear-Next=Temp;Rear-Data=Data;Rear=Temp;return 0;else return 1;template int QueueClass:Pop
29、(DataType &Data)if (!Empty()Data=Front-Data;Front=Front-Next;delete Front-Pre;Front-Pre=NULL;return 0;else return 1;template int QueueClass:GetFront(DataType &Data)if (!Empty()Data=Front-Data;return 0;else return 1;template int QueueClass:Size()BodyNodeStruct *Temp=Front;int Count=0;while (Temp!=Rea
30、r)Count+;Temp=Temp-Next;return Count;template void QueueClass:Clear()DataType Temp;while (!Empty() Pop(Temp);template QueueClass:QueueClass()Clear();delete Front;6 串6.1 基本操作6.1.1 赋值/*函数功能:复制一个串到另一个串中。函数原形:void Copy(char Str, char Source);参数: char Str:目标串; char Source:源串。返回值:无。备注:需包含。*/void Copy(char
31、 Str, char Source)unsigned i;for (i=0;iStr2返回1,如果Str1=Str2返回0,如果Str1Str2返回-1。备注:需包含头文件、。*/int Compare(char Str1, char Str2)unsigned Len,Len1,Len2,i=0;Len1=(unsigned)strlen(Str1);Len2=(unsigned)strlen(Str2);if (Len1Len2) Len=Len1;else Len=Len2;while (toupper(Str1i)=toupper(Str2i) & i=Len-1) i+;if (it
32、oupper(Str2i) return 1;else return -1;elseif (Len1=Len2) return 0;elseif (Len1Len2) return 1;else return -1;6.2 模式匹配6.2.1 一般匹配算法/*函数功能:返回模式串在目标串中的位置。函数原形:int Index(char s, char t, int Pos);参数:char s:目标串;char t:模式串;int Pos:起始检测位置。返回值:int型,如果模式串能够匹配,则返回其在目标串中的位置,否则返回-1。备注:需包含头文件。*/int Index(char s, char t, int Pos)int i,j;i=Pos;j=0;while (i=(int)strlen(s)-1 & j(int)strlen(t)-1) return i-strlen(t);else ret