最近自己用C++寫了一個排序類:
/* * Sort.h * * Created on: 2011-11-6 * Author: allenjin */#ifndef SORT_H_#define SORT_H_#include <iostream>#include "math.h"using namespace std;//下面所用到的n都為要排列數組長度;//first為數組的第一個位置,last為最後一個位置,middle為中間位置template<class T>class Sort {public: Sort(); virtual ~Sort(); int Max(T a[],int n);//返回最大值所在位置 void Swap(T& a,T& b);//交換兩個元素 int Partition(T a[],int first,int last);//分區以最後一個數為KEY,返回其所在位置 void Merge(T a[],int first,int middle,int last);//合并兩個有序數組 void Output(T a[],int n);//列印數組 void SelectionSort(T a[],int n);//選擇排序 void BubbleSort(T a[],int n);//冒泡排序 void InsertionSort(T a[],int n);//插入排序 void CountSort(T a[],T b[],int n);//計數排序 void QuickSort(T a[],int first,int last);//快速排序 void MergeSort(T a[],int first,int last);//合并排序 void RadixSort(T a[],int n,int d);// 基數排序};template<class T>Sort<T>::Sort() { // TODO Auto-generated constructor stub};template<class T>Sort<T>::~Sort() { // TODO Auto-generated destructor stub};template<class T>int Sort<T>::Max(T a[],int n){ T max=0;int position; for(int i=0;i<n;i++) { if(max<a[i]) { max=a[i]; position=i; } } return position;};template<class T>void Sort<T>::Swap(T& a,T& b){ T temp; temp=a; a=b; b=temp;};template<class T>int Sort<T>::Partition(T a[],int first,int last){ T x=a[last]; int i=first-1;int j; for(j=first;j<=last-1;j++) { if(a[j]<=x) { i=i+1; Swap(a[i],a[j]); } } Swap(a[i+1],a[last]); return i+1;};template<class T>void Sort<T>::Merge(T a[],int first,int middle,int last){ int ln=middle-first+1;int rn=last-middle;T max=a[Max(a,last+1)]; T L[ln],R[rn]; for(int i=0;i<ln;i++) L[i]=a[first+i]; for(int j=0;j<rn;j++) R[j]=a[middle+j+1]; L[ln]=max+1;R[rn]=max+1; int i=0,j=0; for(int k=first;k<=last;k++) { if(L[i]<=R[j]) { a[k]=L[i]; i++; } else{ a[k]=R[j]; j++; } }};template<class T>void Sort<T>::Output(T a[],int n){ cout<<"The order is:"<<endl; for(int i=0;i<n;i++) { cout<<a[i]<<"\t"; } cout<<endl;};template<class T>void Sort<T>::BubbleSort(T a[],int n){ for(int i=n-1;i>0;i--) { for(int j=0;j<i;j++) { if(a[j]>a[j+1]) { Swap(a[j],a[j+1]); } } } Output(a,n);}template<class T>void Sort<T>::SelectionSort(T a[],int n){ for(int i=n;i>0;i--) { Swap(a[Max(a,i)],a[i-1]); } Output(a,n);};template<class T>void Sort<T>::InsertionSort(T a[],int n){ int j; for(int i=1;i<n;i++) { T t=a[i]; for(j=i-1;j>=0&&t<a[j];j--) { a[j+1]=a[j]; } a[j+1]=t; } Output(a,n);};template<class T>void Sort<T>::CountSort(T a[],T b[],int n){ T k=a[Max(a,n)];T c[k]; for(int i=0;i<=k;i++) { c[i]=0;//初始化 } for(int j=0;j<n;j++) { c[a[j]]=c[a[j]]+1;//C[i]包含等於i的元素個數 } for(int i=1;i<=k;i++) { c[i]=c[i]+c[i-1];//C【i】包含的小於或等於i的元素個數 } for(int j=n-1;j>=0;j--) { b[c[a[j]]-1]=a[j]; c[a[j]]=c[a[j]]-1; }};template<class T>void Sort<T>::QuickSort(T a[],int first,int last){ if(first<last) { int q=Partition(a,first,last); QuickSort(a,first,q-1); QuickSort(a,q+1,last); }};template<class T>void Sort<T>::MergeSort(T a[],int first,int last){ if(first<last) { int middle=(first+last)/2; MergeSort(a,first,middle); MergeSort(a,middle+1,last); Merge(a,first,middle,last); }};template<class T>void Sort<T>::RadixSort(T a[],int n,int d)//基數排序,其中d為最高的位元{ T b[n];//存放每次按某一位排好後的數; for(int m=0;m<d;m++) { T k=10;//排列的數最大不超過10,以10為基數; T c[k];//存放元素個數 int x=pow(10,m);//位權 for(int i=0;i<=k;i++) { c[i]=0;//初始化 } for(int j=0;j<n;j++) { c[(a[j]/x)%10]=c[(a[j]/x)%10]+1;//C[i]包含等於i的元素個數 } for(int i=1;i<=k;i++) { c[i]=c[i]+c[i-1];//C【i】包含的小於或等於i的元素個數 } for(int j=n-1;j>=0;j--) { b[c[(a[j]/x)%10]-1]=a[j];//b存放排序好的數組 c[(a[j]/x)%10]=c[(a[j]/x)%10]-1;//個數減一 } for(int i=0;i<n;i++) { a[i]=b[i];//每次某位排好後,再賦值給a; } }}#endif /* SORT_H_ */