您的位置:首页 > 其它

合并排序的各种实现方式

2011-05-06 12:45 253 查看
用递归实现:



/*数组实现迭代合并排序*/
#include <stdio.h>
#include<iostream.h>
void printArray(int *head,int len){
printf("/ndatas:");
int i=1;
for(i=1;i<=len-1;i++){
printf("%d  ",head[i]);//打印数组head[]
}
printf("/n");
}

/*	 *	 *	 */
void copyArray(int *head,int *tmp,int len){
int i=0;
for(i=0;i<=len;i++){
head[i]=tmp[i];//将tmp[]数组中内容复制到head[]中
}
}

/*	 *	 *	 */
void MergeTwo(int *head,int *tmp,int l,int m,int h){
//  printf("/nl:%d  m=%d  h=%d/n",l,m,h);
int i=l,j=m+1,k=l;
for(;i<=m&&j<=h;k++){//m位置左右两侧的元素相比较,较小的存储在数组tmp[]中
if(head[i]<=head[j]){
tmp[k]=head[i++];//m左侧元素存入tmp[]中,i后移一位
}else{
tmp[k]=head[j++];//m右侧元素存入tmp[]中,j后移一位
}
}
while(i<=m){//将比较后左侧剩余的元素复制到数组tmp[]中
tmp[k++]=head[i++];
}
while(j<=h){//将比较后右侧剩余的元素复制到数组tmp[]中
tmp[k++]=head[j++];
}
}

/*	 *	 *	 */
void MergeSortFlag(int *head,int *tmp,int len,int flag){
int i=1;
int t;
while(i<=(len-2*flag+1)){
MergeTwo(head,tmp,i,i+flag-1,i+2*flag-1);//将原始数据进行分割成小组,数据为:a[i]到a[i+2*flag-1],
//并对这2*flag个数据进行升序排序,结果存入tmp[]数组中
i=i+2*flag;//i后移
}
//  printf("/ni=%d/n",i);
if(i+flag-1<len){//对分割后还剩下的小于2*flag的数据块进行操作
MergeTwo(head,tmp,i,i+flag-1,len);//如果分割后剩下的块小于flag时,进行MergeTwo操作(尤其针对奇数个数据时)
}else{//如果分割后剩下的块比flag大比2*flag小时,直接复制到tmp数组中
for(t=i;t<=len;t++){
tmp[t]=head[t];
}
}

//   printf("flag:%d",flag);
//   printArray(tmp,len+1);

copyArray(head,tmp,len);//将tmp[]数组中内容复制到head[]中
}

/*	 *	 *	 */
void MergeSort(int *head,int *tmp,int len){
int flag=1;
while(flag<len){
MergeSortFlag(head,tmp,len,flag);//对数组进行分割成大小为2*flag大小的数据块,
//并对每个小数据块进行升序排序,结果存入tmp[]数组中
flag=2*flag;
}
}

/*	 *	 主函数		*	 */
int main (int argc, char *argv[])
{char A;
do
{
int const N=100;
int src
;//src
用来存放需要排序的数据
int tmp
;//tmp
用来存放临时排序数据
int n;
int i;
cout<<"请输入需要排序的数字个数: ";
cin >> n;
n=n+1;
cout<<"请输入 "<< n-1 <<" 个数字:";
for(i=1;i<n;i++)
{	   tmp[i] = 0;//初始化
cin>>src[i];//输入

}
//printArray(src,n);//调用打印数组函数printArray()打印原数组
MergeSort(src,tmp,n-1);//调用排序函数
printArray(tmp,n);//调用打印数组函数printArray()打印已排序数组
getchar();
cout<<"是否继续(y/n):"<<endl;
cin>>A;
}
while(A!='n' && A!='N');
return 0;
}


单链表实现归并排序:

#include <iostream>
using namespace std;

const int N=100;
////////////////////////////////////////
void ScanTarget(int target[], int n, int head[], int tail[]);
int CountHead(int head[]);
void MergeSort(int a[], int head[], int tail[], int m);
void MergePass(int x[], int y[], int s, int a[], int b[], int m);
void Merge(int c[], int d[], int l, int m, int r);
//////////////////////////////////////
int main()
{
char a;
do
{
int target
,head
,tail
;
int i=0,n,m;
for(; i<N; i++)
{
head[i]=-1;
tail[i]=-1;
}
cout<<"请输入要排序的总数:"<<endl;
cin>>n;
cout<<"请输入要排序的数列:" <<endl;
for(i=0; i<n; i++)
cin>>target[i];
ScanTarget(target,n,head,tail);
m=CountHead(head);
MergeSort(target,head,tail,m);
cout<<"排序后:"<<endl;
for(i=0; i<n; i++)
cout<<target[i]<<" ";
cout<<endl;
cout<<"是否继续(y/n):"<<endl;
cin>>a;
}
while(a!='n' && a!='N');
return 0;
}

/////////*******函数实现*********///////////////////
/////////************************///////////////////
void ScanTarget(int target[], int n, int head[], int tail[])//扫描待排数组;
{
int i,j=0,k=0;
head[k]=0;
k++;
for(i=1;i<n;i++)
{
if(target[i-1]>target[i])
{
tail[j++]=i-1;
head[k++]=i;
}
}
tail[j]=n-1;
}
/////////
int CountHead(int head[])//求长度;
{
int i(0);
while(head[i]!=-1)
{
i++;
}
return i;
}
/////////////////////
void MergeSort(int a[], int head[], int tail[], int m)
{
int b
;
int s=1;
while(s<m)
{
MergePass(a,b,s,head,tail,m);
s+=s;
MergePass(b,a,s,head,tail,m);
s+=s;
}
}
//////////////////
void MergePass(int x[], int y[], int s, int a[], int b[], int m)
{
int i=0;
while(i <= m-2*s)
{
Merge(x,y,a[i],b[i+s-1],b[i+2*s-1]);
i=i+2*s;
}
if(i+s < m)
{
Merge(x,y,a[i],b[i+s-1],b[m-1]);
}
else
{
for(int j=i; j<m; j++)
for(int k=a[j]; k<=b[j]; k++)
y[k]=x[k];
}
}
///////////////
void Merge(int c[], int d[], int l, int m, int r)
{
int i,j,k;
i=l;
j=m+1;
k=l;
while((i<=m) && (j<=r))
{
if( c[i] <= c[j] )
d[k++]=c[i++];
else d[k++]=c[j++];
}

if( i>m )
{
for(int q=j; q<=r; q++)
d[k++]=c[q];
}
else
{
for(int q=i; q<=m; q++)
d[k++]=c[q];
}
}
/////////*****程序end*****/////////////////
///////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: