自底向上的排序方法!!(BOTTOMUPSORT)

xinlingwuyu 2005-09-14 09:56:37
n 个按非降序排列的数组元素a[n]
算法如下:
变量s存储被合并的序列的大小
i=1,i=s,i=t用来定义两个要排序的序列的边界 //不懂什么意思??
步骤:
1.t=1
2.while t<n
3.s=t;t=2s;i=0
4.while i+t<=n
5.MERGE(a,i+1,i+s,i+t) //这个函数是合并两个已经排序好的数组,可是i+1,i+s,i+t是什么呢??
6.i=i+t
7.end while
8.if i+s<n then MERGE(a,i+1,i+s,n) //meaning????
9.end while
...全文
684 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhouhuahai 2005-09-15
  • 打赏
  • 举报
回复
二路归并

#include<iostream>
using namespace std;

template <typename T>struct Node{
T key;

};
template <typename T>class Orderedlist{
int maxsize;
int last;
Node<T> slist[100];
public:
Orderedlist(){last=0;maxsize=100;}
int Length() const{return last+1;}//计算表长度
void Mergesort();
void MergePass(Node<T> *b,int len);
void Merge(Node<T> *b,int low,int mid,int high);
bool Insert(Node<T> & elem,int i);
void print();

};
template <typename T> bool Orderedlist<T>::Insert(Node<T> & elem ,int i){
if (i<0||i>last+1||last==maxsize-1) return false;
else{
for (int j=last;j>i;j--) slist[j]=slist[j-1];
slist[i]=elem;
last++;
return true;
}
}
template <typename T> void Orderedlist<T>::print(){
int i;
for(i=0;i<last;i++){
cout<<slist[i].key<<'\t';
if(i%8==7) cout<<endl;
}
cout<<endl;
}
template<typename T> void Orderedlist<T>::Mergesort(){
int len=1;
Node<T> b[100];
while(len<last){
MergePass(b,len);
len=2*len;
for(int i=0;i<last;i++) slist[i]=b[i];
}
}
template <typename T> void Orderedlist<T>::MergePass(Node<T> *b,int len){
int i,j;
i=0;
while(i+2*len<last){
Merge(b,i,i+len-1,i+2*len-1);
i= i+2*len;
}
if(i+len<last) Merge(b,i,i+len-1,last-1);
else for(j=i;j<last;j++) b[j]=slist[j];
}
template <typename T> void Orderedlist<T>::Merge(Node<T> *b,int low,int mid,int high){
int i,j,k;
i=low;
j=mid+1;
k=low;
while((i<=mid)&&(j<=high)){
if(slist[i].key<=slist[j].key) b[k++]=slist[i++];//取小者复制
else b[k++]=slist[j++];
}
while(i<=mid) b[k++]=slist[i++];//复制第一个文件的剩余元素
while(j<=high) b[k++]=slist[j++];//复制第二个文件的剩余元素
}

void main(){
const int h=5;
int i;
Orderedlist<int> ordlist;
int a[h]={5,4,3,2,1};
Node<int> n[h];
for(i=0;i<h;i++) n[i].key=a[i];
for(i=0;i<h;i++) ordlist.Insert(n[i],i); //建立顺序表
cout<<"未排序表:"<<endl;
ordlist.print();
ordlist.Mergesort();
cout<<"已排序表:"<<endl;
ordlist.print();
}
xiaocai0001 2005-09-15
  • 打赏
  • 举报
回复
感觉就是2路归并排序
snowbirdfly 2005-09-14
  • 打赏
  • 举报
回复
楼主看一下数据结构里面的归并排序~
foochow 2005-09-14
  • 打赏
  • 举报
回复
楼主自己看看这个
http://student.zjzk.cn/course_ware/data_structure/web/PAIXU/paixu8.5.1.2.htm
carlkwan 2005-09-14
  • 打赏
  • 举报
回复
堆排序么?
xinlingwuyu 2005-09-14
  • 打赏
  • 举报
回复
那么请你们给我一个"自底向上"的排序方法的程序,好吗?
麻烦你们再加上注释偶!!!
acolu 2005-09-14
  • 打赏
  • 举报
回复
说的不清楚
fujingn188 2005-09-14
  • 打赏
  • 举报
回复

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧