合并排序的各种实现方式
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*****///////////////// ///////////////////////////////////////////
相关文章推荐
- 各种算法的C#实现系列1 - 合并排序的原理及代码分析
- 120941138:java list sort()排序各种方式,实现接口
- Java实现——选择排序、shell排序、合并排序、堆排序
- SYBASE LIST 函数与SQL的合并实现方式
- RecyclerView实现顶部悬浮、字母排序、过滤搜索最优雅的方式
- 各种排序的Ruby实现
- java实现按中文首字母排序的方式
- 合并排序的c语言实现
- 快速排序的两种实现方式(Java)
- 各种排序算法的实现直接插入排序
- 用Java语言实现的各种排序
- 排序技术_各种算法原理 图解 代码实现
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- PHP实现合并两个排序链表的方法
- 1.Java实现各种排序
- 20170206学习日记02:输入输出流,定义接口调用接口,各式类,实现接口各种方式
- TreeSet集合存放自定义类型的对象,可以使用比较器,实现Comparable接口自己设置排序方式
- 快速排序的几种实现方式
- 合并(归并)排序 算法原理与实现
- JAVA实现合并两个排序的链表(《剑指offer》)