您的位置:首页 > 理论基础 > 数据结构算法

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

2010-05-19 18:02 573 查看
/*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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: