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 );
};
具体实现:
view plaincopy to clipboardprint?
#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;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dadalan/archive/2009/07/11/4336281.aspx