最近自己用C++写了一个排序类

最近自己用C++写了一个排序类:

复制代码
?
  
#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
<script type="text/javascript" id="wumiiRelatedItems"> </script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值