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

书籍源码

开发平台:

Visual C++

  1. //【例6.6】升序直接插入排序算法,作为【例6.4】Orderedlist<T,size>类的
  2. //成员函数InsertSort(),T为关键字类型。
  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 InsertSort();
  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>::InsertSort(){
  36. T temp;
  37. int i,j;
  38. for (i=1;i<=last;i++){
  39. temp=slist[i];
  40. j=i;
  41. while (j>0&&temp<slist[j-1]){
  42. slist[j]=slist[j-1];
  43. j--;//查找与移动同时做
  44. }
  45. slist[j]=temp;
  46. }
  47. }
  48. class Element{
  49. string  key;
  50. // 其他域省略
  51. public:
  52. bool operator<(Element ele){return key<ele.key;}
  53. void putkey(string k){key=k;}
  54. void show(){cout<<key<<'t';}
  55. };//再次指出分号不可少
  56. int main(){
  57. const int h=10;
  58. int i;
  59. Orderedlist<Element,100> ordlist;
  60. string mslist[h]={"cat","book","car","zoo","fish","cab","dog","cap","fox","can"};
  61. Element n[h];
  62. for(i=0;i<h;i++)  n[i].putkey(mslist[i]);
  63. for(i=0;i<h;i++)  ordlist.Insert(n[i],i); //建立顺序表
  64. cout<<"未排序表:"<<endl;
  65. ordlist.print();
  66. ordlist.InsertSort();
  67. cout<<"已排序表:"<<endl;
  68. ordlist.print();
  69. return 0;
  70. }