数据结构各种内部排序课程设计

本文档提供了一个名为dataList的模板类实现,用于不同类型的内部排序算法,包括气泡排序、插入排序、选择排序、快速排序、希尔排序和堆排序。每个排序算法都有相应的成员函数,用于执行排序并计算移动和比较次数。通过示例代码展示了如何使用这个类进行排序,并输出排序后的序列及操作次数。
摘要由CSDN通过智能技术生成

  /*dataList.h*/    
  #include<iostream.h>    
  #include<stdlib.h>    
  const   int   DefaultSize=100;    
  template<class   T>class   dataList;    
  template<class   T>class   Element{    
  friend   class   dataList<T>;    
  private:    
  T   key;    
  public:    
  Element():key(0){}    
  T   getKey(){return   key;}    
  void   setKey(const   T   x){key=x;}    
  Element<T>&operator=(Element<T>&x){    
  key=x.key;    
  return   *this;    
  }    
  int   operator==(Element<T>&   x){return   key==x.key;}    
  int   operator<=(Element<T>&   x){return   key<=x.key;}    
  int   operator   <(Element<T>&   x){return   key<   x.key;}    
  int   operator   >(Element<T>&   x){return   key>   x.key;}    
  };    
  template<class   T>class   dataList{    
  private:    
  Element<T>*   Vector;    
  int   MaxSize,currentsize;    
  public:    
  dataList(int   MaxSz=DefaultSize):MaxSize(MaxSz),currentsize(0)    
  {    
  Vector=new   Element<T>[MaxSz];}    
  dataList(T   A[],int   n,int   MaxSz=DefaultSize):MaxSize    
  (MaxSz),currentsize(n){    
  Vector=new   Element<T>[MaxSz];    
  for(int   i=0;i<currentsize;i++)    
  Vector[i].key=A[i];    
  }    
  void   Swap(Element<T>&x,Element<T>&y){    
  Element<T>   temp=x;x=y;y=temp;    
  }    
  void   BubbleSort();    
  void   InsertSort();    
  void   SelectSort();    
  void   QuickSort(const   int   left,const   int   right);    
  int   Partition(const   int   low,const   int   high);    
  void   ShellSort();    
  void   HeapSort();    
  void   FilterDown(const   int   i,const   int   EndOfHeap);    
  void   Print();    
  int   move,compare;    
  };    
  template<class   T>void   dataList<T>::BubbleSort(){    
  //气泡排序    
  move=0;compare=0;    
  int   pass=1;int   exchange=1;    
  while(pass<currentsize&&exchange){    
  exchange=0;    
  for(int   j=currentsize-1;j>=pass;j--)    
  if(Vector[j-1]>Vector[j]){    
  Swap(Vector[j-1],Vector[j]);move=move+3;    
  exchange=1;    
  }compare++;    
  pass++;    
  }    
  }    
   
  template<class   T>void   dataList<T>::InsertSort(){    
  //直接插入排序    
  move=0;compare=0;    
  Element<T>temp;int   i,j;    
  for(i=1;i<currentsize;i++){    
  temp=Vector[i];j=i;move=move+2;    
  for(j=i;j>0;j--)    
  if(temp<Vector[j-1])   {Vector[j]=Vector[j-1];move++;}    
  else   break;compare++;    
  Vector[j]=temp;move++;    
  }    
  }    
   
  template<class   T>void   dataList<T>::SelectSort(){    
  //简单选择排序    
  move=0;compare=0;    
  for(int   i=0;i<currentsize-1;i++){    
  int   k=i;    
  for(int   j=i+1;j<currentsize;j++)    
  if(Vector[j]<Vector[k]){k=j;move++;}compare++;    
  if(k!=i){Swap(Vector[i],Vector[k]);move=move+3;}    
  }    
  }    
   
  template<class   T>void   dataList<T>::QuickSort(const   int   left,const   int   right){    
  //快速排序    
  move=0;compare=0;    
  if(left<right){    
  int   pivotpos=Partition(left,right);    
  if(left<pivotpos-1)QuickSort(left,pivotpos-1);    
  if(pivotpos+1<right)QuickSort(pivotpos+1,right);    
  }    
  }    
   
  template<class   T>int   dataList<T>::Partition(const   int   low,const   int   high){    
  int   pivotpos=low;Element<T>   pivot=Vector[low];move++;    
  for(int   i=low+1;i<=high;i++)    
  if(Vector[i]<pivot){    
  pivotpos++;    
  if(pivotpos!=i){Swap(Vector[pivotpos],Vector    
  [i]);move=move+3;}    
  }compare++;    
  Swap(Vector[low],Vector[pivotpos]);move=move+3;    
  return   pivotpos;    
  }    
   
  template<class   T>void   dataList<T>::ShellSort(){    
  //希尔排序    
  move=0;compare=0;    
  Element<T>   temp;    
  int   gap=currentsize/2,i,j;    
  while(gap!=0){    
  for(i=gap;i<currentsize;i++){    
  temp=Vector[i];move++;    
  for(j=i;j>=gap;j-=gap)    
  if(temp<Vector[j-gap]){Vector[j]=Vector[j-    
  gap];move++;}    
  else   break;compare++;    
  Vector[j]=temp;move++;    
  }    
  gap=gap/2;    
  }    
  }    
   
  template<class   T>void   dataList<T>::HeapSort(){    
  //堆排序    
  move=0;compare=0;    
  for(int   i=(currentsize-2)/2;i>=0;i--)FilterDown(i,currentsize-1);    
  for(i=currentsize-1;i>=0;i--){    
  Swap(Vector[0],Vector[i]);move=move+3;    
  FilterDown(0,i-1);    
  }    
  }    
   
   
  template<class   T>void   dataList<T>::FilterDown(const   int   i,const   int   EndOfHeap){    
  int   current=i;int   child=2*i+1;    
  Element<T>   temp=Vector[i];move++;    
  while(child<=EndOfHeap){    
  if(child<EndOfHeap&&Vector[child].key<Vector[child+1].key)      
  child=child+1;compare++;    
  if(temp.key>=Vector[child].key)break;    
  else{    
  Vector[current].key=Vector[child].key;    
  current=child;child=2*child+1;move=move+3;    
  }compare++;    
  }    
  Vector[current].key=temp.key;move++;    
  }    
   
  template<class   T>void   dataList<T>::Print(){    
  for(int   i=0;i<currentsize;i++)    
  cout<<Vector[i].key<<",   ";    
  cout<<endl;    
  }    
   
   
  /*Sort.cpp*/    
  #include<iostream.h>    
  #include<stdlib.h>    
  #include<time.h>     
  /*#include"dataList.h"     */ 
  int   main()    
  {    
  int   a[6],i;    
  srand(time(0));    
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL1(a,6);    
  cout<<"初始序列为";    
  DL1.Print();    
  DL1.BubbleSort();    
  cout<<"气泡排序法后";    
  DL1.Print();    
  cout<<"移动次数   "<<DL1.move<<"   "<<"比较次数   "<<DL1.compare<<endl;    
   
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL2(a,6);    
  cout<<"初始序列为";    
  DL2.Print();    
  DL2.InsertSort();    
  cout<<"直接插入排序后";    
  DL2.Print();    
  cout<<"移动次数   "<<DL2.move<<"   "<<"比较次数   "<<DL2.compare<<endl;    
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL3(a,6);    
  cout<<"初始序列为";    
  DL3.Print();    
  DL3.SelectSort();    
  cout<<"简单选择排序后";    
  DL3.Print();    
  cout<<"移动次数   "<<DL3.move<<"   "<<"比较次数   "<<DL3.compare<<endl;    
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL4(a,6);    
  cout<<"初始序列为";    
  DL4.Print();    
  DL4.QuickSort(0,5);    
  cout<<"快速排序后";    
  DL4.Print();    
  cout<<"移动次数   "<<DL4.move<<"   "<<"比较次数   "<<DL4.compare<<endl;    
   
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL5(a,6);    
  cout<<"初始序列为";    
  DL5.Print();    
  DL5.ShellSort();    
  cout<<"希尔排序后";    
  DL5.Print();    
  cout<<"移动次数   "<<DL5.move<<"   "<<"比较次数   "<<DL5.compare<<endl;    
   
   
  for(i=0;i<6;i++)    
  a[i]=1+rand()%50;    
  dataList<int>   DL6(a,6);    
  cout<<"初始序列为";    
  DL6.Print();    
  DL6.HeapSort();    
  cout<<"堆排序后";    
  DL6.Print();    
  cout<<"移动次数   "<<DL6.move<<"   "<<"比较次数   "<<DL6.compare<<endl;    
   
  return   1;    
  }    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值