您的位置:首页 > 编程语言 > C语言/C++

六种排序的C++实现

2011-04-22 23:04 423 查看
整理旧的博客 2008-10-23 12:38:28
排序的python实现可以看
http://blog.csdn.net/wklken/archive/2011/04/11/6315567.aspx
--------------------------------------------------------------------



最近交的作业,测试成功,可以输出排序具体过程

汗,自己先用java写的,然后才使C++

可能某些地方用C++可以更简便灵活~~~多指教~~~



总的定义:

class SortNum 
{
public:
 SortNum();
 virtual ~SortNum();
    void exchange(int& b,int& c);//交换数据
    void listout(int a[],int n);//列出所有
 void selectSort(int a[],int n);//选择
 void bublbleSort(int a[],int n);//冒泡
 void insertSort(int a[],int n);//插入
 void baseSort(int a[],int n);//基数
 void quickSort(int a[],int n,int left,int right);//快速
 
 void Merge(int *SR, int *TR, int i, int m, int n);//归并
 void Msort( int *SR, int *TR1, int s, int t );
 void Copy( int *S, int *T, int s, int t );

};




具体实现:

#include "SortNum.h"
#include "iostream.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

SortNum::SortNum()
{
 

}

SortNum::~SortNum()
{

}

//交换两个元素
void SortNum::exchange(int& b,int& c)
{
 int tem;
 tem=b;
 b=c;
 c=tem;
}
//输出数组所有元素
void SortNum::listout(int a[],int n)
{
 for(int i=0;i<n;i++)
  cout <<a[i]<<" ";
 cout <<endl;
}

//选择排序
void SortNum::selectSort(int a[],int n)
{
 for(int i=0;i<n-1;i++)
  {
   int k=i;
   for(int j=i+1;j<n;j++)
    if(a[j]<a[k])
     k=j;
   exchange(a[i],a[k]);
   listout(a,n);
   
  }
}
//冒泡排序
void SortNum::bublbleSort(int a[],int n)
{
 for(int i=n;i>1;i--)
   for(int j=0;j<i-1;j++)
   {
    if(a[j]>a[j+1])
    {
     exchange(a[j],a[j+1]);
     listout(a,n);
     
    }
   }
}
//插入排序
void SortNum::insertSort(int a[],int n)
{
 for(int i=1;i<n;i++)//从第二个元素开始
  {
   int tem=a[i];
   int j;
   for(j=i-1;j>=0 && tem<a[j];j--)//判断比其小的,因为前面已经排好序列了,所以可以比,然后后退
    a[j+1]=a[j];
   a[j+1]=tem;//插入
   listout(a,n);
  
  }
}
//基数排序
void SortNum::baseSort(int a[],int n)
{
      int r=10;//基数为十
   int tem=1;
  
  
   int max=a[0];
   for(int i=0;i<n;i++)//找出最大的,以在while中确定结束的时机
   {
    if(a[i]>max)
     max=a[i];
   }
  while((max%r)/tem !=0)//若最大的运算完为0.则整个基数排序结束
  {
   for(int i=n;i>1;i--)
    for(int j=0;j<i-1;j++)
    {
     if((a[j]%r)/tem>(a[j+1]%r)/tem)
     {
      exchange(a[j],a[j+1]);
      
     }
    }
   listout(a,n);
  
   tem *=10;
   r *=10;
 
  }

}
//快速排序
void SortNum::quickSort(int a[],int n,int left,int right)
{
      int i,j;
  i=left;
  j=right;
  int middle=a[(left+right)/2];
  do
  {
   while(a[i]<middle && i<right)//在左右找出一对,然后交换
    i++;                        //问1:没成对怎么办?只有一个比中间小的,怎么弄?

                                //知道的吼!!
   while(a[j]>middle && j>left)
    j--;
   if(i<=j)
   {
    exchange(a[i],a[j]);
    i++;
    j--;
    listout(a,n);//输出有些问题,递归调用中也输出???
    
   }
  }while(i<=j);
   
  if(left<j)//递归调用排序左右两边,级级深入
   quickSort(a,n,left,j);
  if(right>i)
   quickSort(a,n,i,right);
}
//归并排序
//二路归并   问题~~无法输出详细过程
void SortNum::Merge(int *SR, int *TR, int i, int m, int n){

    // 将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]

    int j = m+1;

    int k = i;

    for(; i<=m && j<=n; ++k){// 将SR中记录按关键字从小到大地复制到TR中

        if (SR[i]<=SR[j]){

            TR[k] = SR[i++];

        }else{

            TR[k] = SR[j++];

        }

    }

    while (i<=m) TR[k++] = SR[i++];   // 将剩余的 SR[i..m] 复制到TR

    while (j<=n) TR[k++] = SR[j++];   // 将剩余的 SR[j..n] 复制到TR

}//Merge

void SortNum::Msort( int *SR, int *TR1, int s, int t ){

    // 对SR[s..t]进行归并排序,排序后的记录存入TR1[s..t]

    if (s==t){

        TR1[s] = SR[s];

    }else {

       
        int TR2[7];//注:若main中数组改这里一定要改~~~~
        int m = (s+t)/2;   // 将 SR[s..t] 平分为 SR[s..m] 和 SR[m+1..t]

        Msort(SR,TR2,s,m);  // 递归地将 SR[s..m] 归并为有序的 TR2[s..m]

        Msort(SR,TR2,m+1, t); // 递归地将SR[m+1..t]归并为有序的TR2[m+1..t]

        Merge(TR2,TR1,s,m,t); // 将TR2[s..m]和TR2[m+1..t] 归并到 TR1[s..t]
      Copy(SR,TR1,s,t);

    }// else

} // Msort
void SortNum::Copy( int *S, int *T, int s, int t )
{
    for(int i=s;i<=t;i++)
  S[i]=T[i];
    listout(S,7);
}

 

void main()
{
 int a[7]={81,129,655,543,987,26,794};//问题:数组中了length怎么解决
 SortNum so;
 cout <<"原始数据"<<endl;
 so.listout(a,7);
 //so.exchange(a[0],a[1]);//测试exchange方法
 //so.listout(a,7);
    cout <<"选择排序类型:1.选择,2.冒泡,3.插入,4.基数 5.快速 6.归并"<<endl;
 int n;
 cin >>n;
 int b[7];
 switch( n)
 { 
  case 1:so.selectSort(a,7);break;
  case 2:so.bublbleSort(a,7);break;
  case 3:so.insertSort(a,7);break;
  case 4:so.baseSort(a,7);break;
  case 5:so.quickSort(a,7,0,6);break;
  case 6:so.Msort(a,b,0,6);break;

 }
 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: