Ex6_7.cpp
上传用户:wuzhousb
上传日期:2022-07-12
资源大小:380k
文件大小:2k
源码类别:

书籍源码

开发平台:

Visual C++

  1. //【例6. 7】升序对半插入排序算法,亦作为Orderedlist<T,size >类的成员函数。
  2. //在顺序表已排好序的部分查找后一元素插入位置时,采用对半查找方法。
  3. #include<iostream>
  4. #include<string>
  5. using namespace std;
  6. template <typename T,int size>class Orderedlist{
  7. int maxsize;
  8. int last;
  9. T slist[size];
  10. public:
  11. Orderedlist(){last=-1;maxsize=size;}
  12. void BinaryInsertSort();
  13. bool Insert(T & elem,int i);
  14. void print();
  15. // 无关成员函数省略
  16. };//再次指出分号不可少
  17. template <typename T,int size> bool Orderedlist<T,size>::Insert(T & elem ,int i){
  18. int j;
  19. if (i<0||i>last+1||last==maxsize-1) return false;
  20. else{
  21. last++;
  22. for (j=last;j>i;j--) slist[j]=slist[j-1];
  23. slist[i]=elem;
  24. return true;
  25. }
  26. }
  27. template <typename T,int size> void Orderedlist<T,size>::print(){
  28. int i;
  29. for(i=0;i<=last;i++){
  30. slist[i].show();
  31. if(i%5==4) cout<<endl;
  32. }
  33. cout<<endl;
  34. }
  35. template <typename T,int size> void Orderedlist<T,size>::BinaryInsertSort(){
  36. T temp;
  37. int low,high,mid,i,j;
  38. for (i=1;i<=last;i++){
  39. temp=slist[i];
  40. low=0;
  41. high=i-1;
  42. while (low<=high){//请注意与对半查找的不同之处
  43. mid=(low+high)/2;
  44. if(temp<slist[mid])  high=mid-1;
  45. else  low=mid+1;
  46. }//稳定排序
  47. for(j=i-1;j>=low;j--) slist[j+1]=slist[j];
  48. slist[low]=temp;
  49. }
  50. }
  51. class Element{
  52. string  key;
  53. // 其他域省略
  54. public:
  55. bool operator<(Element ele){return key<ele.key;}
  56. void putkey(string k){key=k;}
  57. void show(){cout<<key<<'t';}
  58. };//再次指出分号不可少
  59. int main(){
  60. const int h=10;
  61. int i;
  62. Orderedlist<Element,100> ordlist;
  63. string mslist[h]={"cat","book","car","zoo","fish","cab","dog","cap","fox","can"};
  64. Element n[h];
  65. for(i=0;i<h;i++)  n[i].putkey(mslist[i]);
  66. for(i=0;i<h;i++)  ordlist.Insert(n[i],i); //建立顺序表
  67. cout<<"未排序表:"<<endl;
  68. ordlist.print();
  69. ordlist.BinaryInsertSort();
  70. cout<<"已排序表:"<<endl;
  71. ordlist.print();
  72. return 0;
  73. }