请教一个排序的算法问题?
日期:2007-03-30 荐:
请教一个排序的算法问题?我要边采集数据,而且数据量很大,然后把采集到的数据生成有序序列。但是有个问题就是采集到的数据有个特点:1,能本身就是有序的:2,部分有序或者可以说只有局部是杂乱的;;3,数据很乱。在这过程中可以有好几种处理方法:1),等所有的数据都采集到了以后,然后进行一次排序。由于采集到的数据本身可能就是有序的,就不能使用快速排序。因为我不能忍受这个排序的时间。所以感觉采用堆排序来排序。2),每采到一个数据,就插入到有序序列,从而生成一个有序序列。当然查找插入点的时候,用类似于折半查找的算法来查找插入点。请教一下大家,处理这种情况最好使用什么样的算法。要使排序的效率高。如何利用这个数据本身局部有序的那个特点。我上面的两种排序思路哪种更好点呢???望大家能指点一下这个算法思想。二叉检索树是处理排序问题最好的数据结构。用链表插入排序而查找最好的式散列所以应该生成两个表一个链表用来存放排序后的数据第二个散列表,用来快速查找万一原始数据是有序得话,无论是构造还是搜索得效率都是不高得。链表得插入排序的效率实在是不敢恭维,无论是采到的数据是有序还是无序都很慢的。大家思考一下在我那种情况下最好用什么方法!道生一,一生二,二生三,三生万物∵万物中有数。∴数的基类是道。看着另一篇,回答在这篇....二叉排序树散列表真是很 popular 呀,散列表是不是一种链表结构?c 中如何实现呢?让它顶起来!RBtree用归并排序 结合外排序的一些特点来作 一次排一部分还是可以使用堆排序的二叉排序/*从指定的文件中读取数据作为键值,生成一棵二叉排序树,注意当输入的数据已经在树上存在时则放弃当前键值,然后用递归中序遍历整棵树,输出有序序列*/typedef struct node{int data;node* Lc;node *Rc;}* Btree; #include<iostream>#include<fstream>Btree Creat_Btree(char*);void Midorder(Btree L);void inorder(Btree);using namespace std;/*********************************************/void main(){ system("type bin_sort_tree.cpp");Btree JJ=Creat_Btree("in.txt");//创建二叉排序树 if(JJ) { Midorder(JJ);//中序递归遍历 cout<<endl;inorder(JJ);//中序非递归遍历 } system("pause");}/**********************************************/Btree Creat_Btree(char * finam){fstream in(finam);if(!in){cout<<" File not open ! "<<endl;return NULL;} Btree root=new node; root->Lc=root->Rc=NULL; int key=0; if(in>>root->data){ //文件不空则继续读数 while(in>>key) { Btree s=new node;s->Lc=s->Rc=NULL;s->data=key; Btree p=root; bool flag=true; while(p->Lc||p->Rc) { while(p->data>key&&p->Lc) p=p->Lc;if(p->data>key) { p->Lc=s; flag=false; break; } while(p->data<key&&p->Rc) p=p->Rc; if(p->data<key) { p->Rc=s; flag=false; break; } if(p->data==key){flag=false;break;} } if(flag) if(p->data<key)p->Rc=s; else p->Lc=s; }return root; }else { cout<<"file open but is empty!"<<endl; return NULL;} }/***************************经典递归遍历算法**********************************/void Midorder(Btree L){if(L){// cout<<L->data;//此处为前序遍历(Midorder(L->Lc));cout<<L->data<<" ,";//此处为中序遍历(Midorder(L->Rc)); // if(!L->Lc&&!L->Rc) cout<<L->data;// 此处为后序遍历}}/*********************非递归遍历算法**********************************/void inorder(Btree T){ Btree *stack=new Btree[50]; int top=0; Btree p=T;while(p||top>0){ while(p) { stack[top]=p; top ; //cout<<p->data<<" ";//在此输出为先序遍历 p=p->Lc; }if(top>0){top--;p=stack[top];cout<<p->data<<" ";//在此输出为中序遍历p=p->Rc;}}}自己改吧!楼上的兄弟,谢谢你给我二叉树排序,但是我并不需要程序。我希望各位能说说这种情况下用什么算法比较好,为什么好!当然是堆排序了堆排序在新增结点时调整堆结构耗费较小我喜欢楼主的方案二。根据你的描述,数据可能是有序的,也可能是无序的。要利用本身的有序性,就要作判断,增加了程序的复杂性。
标签: