这是完全自主编码,哈哈。但是思想还是书上先有的,但是没有具体代码。下面是运行结果截图,输入的为23 ,45,2,15,9
冒牌排序流程如下,一次正向冒泡,从左至右。然后一次反向冒泡,从右至左。
第一次把最大的记录放到表尾,第二次将最小记录放到表头,如此反复。
pos[0]记录无序序列的第一个位置0,pos[1]记录无序表的最后一个位置len-1;
步长为d,正向冒泡为1,反响冒泡为-1.合并两方向为:
for(int i=pos[(1-d)/2];i!=pos[(1+d)/2];i=i+d).
changeFlag 用来标志是否有交换,如果没有交换则终止循环。
如果有交换,则将最后一次交换的位置赋给change。
在一次循环冒泡结束后将步长取反,如果changeFlag 为真则继续。
在之前的“静态表查找”代码中加入如下函数,实现双向排序功能。
template void SSearch::BiDirectionAscendSort() //双向冒泡排序 { T t; int pos[2]; pos[0]=0; pos[1]=len-1; int d=1; // d 步长,正向冒泡为1,反向冒泡为-1 bool changeFlag=false; int change=len-1; //记录最后一次进行交换的位置 do { changeFlag=false; for(int i=pos[(1-d)/2];i!=pos[(1+d)/2];i=i+d) { if(d>0) //正向 { if(i==len-1) //最后一位不与其后面一位比较 break; if(ST[i].key>ST[i+d].key) { t=ST[i].key; ST[i].key=ST[i+d].key; ST[i+d].key=t; if(!changeFlag) changeFlag=true; change=i; } } else { if(i==0) //最前一位不与-1位比较 break; if(ST[i].key { t=ST[i].key; ST[i].key=ST[i+d].key; ST[i+d].key=t; change=i; if(!changeFlag) changeFlag=true; } } Display();//看看现在排序情况 } if(changeFlag) { pos[(1+d)/2]=change; cout<<"Change at/t"<<<"/n"; if(d>0) cout<<"----正向冒泡一次结束/n"; else cout<<"----反向冒泡一次结束/n"; } else cout<<"NO CHANGE!! END NOW/n"; d=-d; }while(changeFlag); }
全部代码为:
// StaticSearch.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "StaticSearch.h" #include <iostream> using namespace std; template<class T> SSearch<T>::SSearch() { ST=NULL; len=0; } template<class T> SSearch<T>::~SSearch() { delete []ST; len=0; } template<class T> void SSearch<T>::Create(int n) { len=n; ST=new Node<T>[len]; Node<T> e; int i=0; cout<<"INPUT:"<<len<<" DATA ELEMENT/n"; while(i<len) { cin>>e.key; ST[i]=e; i++; } } template<class T> int SSearch<T>::SeSearch(T key) { for(int i=len-1;i>=0;i--) if(ST[i].key==key) { cout<<"Find SUCCESS! Locate at:"<<i+1<<"/n"; return i; } cout<<"CANNOT FIND/n"; return -1; } template<class T> void SSearch<T>::BiDirectionAscendSort() //双向冒泡排序 { T t; int pos[2]; pos[0]=0; pos[1]=len-1; int d=1; // d 步长,正向冒泡为1,反向冒泡为-1 bool changeFlag=false; int change=len-1; //记录最后一次进行交换的位置 do { changeFlag=false; for(int i=pos[(1-d)/2];i!=pos[(1+d)/2];i=i+d) { if(d>0) //正向 { if(i==len-1) //最后一位不与其后面一位比较 break; if(ST[i].key>ST[i+d].key) { t=ST[i].key; ST[i].key=ST[i+d].key; ST[i+d].key=t; if(!changeFlag) changeFlag=true; change=i; } } else { if(i==0) //最前一位不与-1位比较 break; if(ST[i].key<ST[i+d].key) { t=ST[i].key; ST[i].key=ST[i+d].key; ST[i+d].key=t; change=i; if(!changeFlag) changeFlag=true; } } Display();//看看现在排序情况 } if(changeFlag) { pos[(1+d)/2]=change; cout<<"Change at/t"<<change<<"/n"; if(d>0) cout<<"----正向冒泡一次结束/n"; else cout<<"----反向冒泡一次结束/n"; } else cout<<"NO CHANGE!! END NOW/n"; d=-d; }while(changeFlag); } template<class T> void SSearch<T>::Ascendsort() { T t; for(int i=0;i<len;i++) //pop sort ,every time ,it sorted (i+1) numbers at the end of the number line { for(int j=0;j<len-i-1;j++) { if(ST[j].key>ST[j+1].key) { t=ST[j].key; ST[j].key=ST[j+1].key; ST[j+1].key=t; } } } cout<<"Ascend SORT SUCCESS|!/n"; } template<class T> int SSearch<T>::BiSearch_1(T key) //折半查找 { if(len==0&&ST==NULL) { cout<<"The Sort Table doesn't exit, plz CREAT it first!/n"; return -1; } else { int low=0,high=len-1; int mid; while(low<=high) { mid=(high+low)/2; if(ST[mid].key==key) { cout<<"Find! Locate at :"<<mid+1<<"/n"; return mid; } if(ST[mid].key>key) high=mid-1; else low=mid+1; } cout<<"CANNOT FIND/n"; return -1; } } template<class T> int SSearch<T>::BiSearch2(int x, int y,T key) //recursive to find the key InBtween x an y,inlcude x and y { int mid=(x+y)/2; if(ST[mid].key==key) return mid; if(x>y) return -1; if(key< ST[mid].key) return BiSearch2(x,mid-1,key); else return BiSearch2(mid+1,y,key); } template<class T> int SSearch<T>::BiSearch_2(T key) { int k; k=BiSearch2(0,len-1,key); return k; } template<class T> void SSearch<T>::Display() { cout<<"Static Table keys are:/n"; for(int i=0;i<len;i++) { cout<<ST[i].key<<" "; } cout<<"/n"; } int _tmain(int argc, _TCHAR* argv[]) { int choice, n,k; SSearch<int> a; cout<<"ATTENSSION:must CREAT the table fisrt~/n"; T key; do { cout<<"----1.Create Tables--------------------/n" <<"----2.Sequential Find--------------------/n" <<"----3.Binary Search(Recursive)--------------------/n" <<"----4.Binary Search(Non Recursive)--------------------/n" <<"----5.Output the keys in Static Table--------------------/n" <<"----6.QUIT--------------------/n" <<"----7.双向冒泡排序--------------------/n"; cin>>choice; switch(choice) { case 1: cout<<"Input the length of the Static Table/n"; cin>>n; a.Create(n); break; case 2: cout<<"Input The key to Search:/n"; cin>>key; a.SeSearch(key); break; case 3: a.Ascendsort(); cout<<"Input the key to Search:/n"; cin>>key; k=a.BiSearch_2(key); if(k==-1) cout<<"Didn't Find!/n"; else cout<<"Found!Locate At :"<<k+1<<"/n"; break; case 4: a.Ascendsort(); cout<<"Input the key to Search:/n"; cin>>key; a.BiSearch_1(key); break; case 5: a.Display(); break; case 6: cout<<"End/n"; break; case 7: a.BiDirectionAscendSort(); break; } }while(choice!=6); return 0; }


943

被折叠的 条评论
为什么被折叠?



