整理旧的博客 2008-10-23 12:38:28
排序的python实现可以看
http://blog.csdn.net/wklken/archive/2011/04/11/6315567.aspx
--------------------------------------------------------------------
最近交的作业,测试成功,可以输出排序具体过程
汗,自己先用java写的,然后才使C++
可能某些地方用C++可以更简便灵活~~~多指教~~~
总的定义:
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 );
};
具体实现:
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;
}
}