C++排序類

來源:互聯網
上載者:User
最近自己用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_ */

  


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.