#include<iostream>
#define MAX 100
using namespace std;
class Sample
{
int a[MAX];
int b[MAX];
int n;
friend class Process;
public:
Sample(){n=0;}
};
class Process
{
private:
int s_psort(Sample &s,int first,int end);
void sift(int k,int m,Sample &s);
public:
void getdata(Sample &s);
void s_isort(Sample &s);
void s_ssort(Sample &s);
void s_bsort(Sample &s);
void s_qsort(Sample &s,int first,int end);
void s_selsort(Sample &s);
void s_hsort(Sample &s);
void disp(Sample &s);
};
void Process::s_isort(Sample &s)
{
int temp;
for(int i=1;i<s.n;i++)
{
temp=s.a[i];
for(int j=i-1;j>=0&&temp<s.a[j];j--)
s.a[j+1]=s.a[j];
s.a[j+1]=temp;
}
}
void Process::s_ssort(Sample &s)
{
int temp;
for(int d=s.n/2;d>0;d=d/2)
{
for(int i=d;i<s.n;i++)
{
temp=s.a[i];
for(int j=i-d;j>=0&&temp<s.a[j];j=j-d)
s.a[j+d]=s.a[j];
s.a[j+d]=temp;
}
}
}
void Process::s_bsort(Sample &s)
{
int temp;
for(int i=0;i<s.n-1;i++)
for(int j=i+1;j<s.n;j++)
if(s.a[i]>s.a[j])
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
}
}
int Process::s_psort(Sample &s,int first,int end)
{
int i=first,j=end,temp;
while(i<j)
{
while(i<j&&s.a[i]<=s.a[j])
j--;
if(i<j)
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
i++;
}
while(i<j&&s.a[i]<=s.a[j])
i++;
if(i<j)
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
j--;
}
}
return i;
}
void Process::s_qsort(Sample &s,int first,int end)
{
int p;
if(first<end)
{
p=s_psort(s,first,end);
s_qsort(s,first,p-1);
s_qsort(s,p+1,end);
}
}
void Process::s_selsort(Sample &s)
{
int temp,temp2;
for(int i=0;i<s.n-1;i++)
{
temp=i;
for(int j=i+1;j<s.n;j++)
if(s.a[temp]>s.a[j])
temp=j;
temp2=s.a[i];
s.a[i]=s.a[temp];
s.a[temp]=temp2;
}
}
void Process::sift(int k,int m,Sample &s)
{
int i=k,j=2*i+1,temp;
while(j<m)
{
if(j<m-2&&s.a[j]<s.a[j+1])// 体会j<m
j++;
if(s.a[i]>=s.a[j]) break;
else {
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
i=j;
j=2*j+1;
}
}
}
void Process::s_hsort(Sample &s)
{
int temp;
for(int i=(s.n-1)/2;i>=0;i--)
sift(i,s.n,s);
for(int j=0;j<s.n-1;j++)
{
temp=s.a[0];
s.a[0]=s.a[s.n-j-1];
s.a[s.n-j-1]=temp;
sift(0,s.n-j-1,s);
}
}
void Process::getdata(Sample &s)
{
cout<<"元素个数:";
cin>>s.n;
for(int i=0;i<s.n;i++)
{
cout<<"输入第"<<i+1<<"个数据:";
cin>>s.a[i];
}
}
void Process::disp(Sample &s)
{
for(int i=0;i<s.n;i++)
cout<<s.a[i]<<" ";
cout<<endl;
}
int main()
{
int sel;
Sample s;
Process p;
p.getdata(s);
cout<<"原来序列:";
p.disp(s);
cout<<"1:插入排序 2:希尔排序 3:冒泡排序 4:快速排序 5:选择排序 6:堆排序 "<<endl;
cout<<"选择排序方法:";
cin>>sel;
switch(sel)
{
case 1:
p.s_isort(s);
cout<<"插入排序:";
break;
case 2:
p.s_ssort(s);
cout<<"希尔排序:";
break;
case 3:
p.s_bsort(s);
cout<<"冒泡排序:";
break;
case 4:
p.s_qsort(s,0,sel-1);
cout<<"快速排序:";
break;
case 5:
p.s_selsort(s);
cout<<"选择排序:";
break;
case 6:
p.s_hsort(s);
cout<<"堆排序:";
break;
}
p.disp(s);
return 0;
}
#define MAX 100
using namespace std;
class Sample
{
int a[MAX];
int b[MAX];
int n;
friend class Process;
public:
Sample(){n=0;}
};
class Process
{
private:
int s_psort(Sample &s,int first,int end);
void sift(int k,int m,Sample &s);
public:
void getdata(Sample &s);
void s_isort(Sample &s);
void s_ssort(Sample &s);
void s_bsort(Sample &s);
void s_qsort(Sample &s,int first,int end);
void s_selsort(Sample &s);
void s_hsort(Sample &s);
void disp(Sample &s);
};
void Process::s_isort(Sample &s)
{
int temp;
for(int i=1;i<s.n;i++)
{
temp=s.a[i];
for(int j=i-1;j>=0&&temp<s.a[j];j--)
s.a[j+1]=s.a[j];
s.a[j+1]=temp;
}
}
void Process::s_ssort(Sample &s)
{
int temp;
for(int d=s.n/2;d>0;d=d/2)
{
for(int i=d;i<s.n;i++)
{
temp=s.a[i];
for(int j=i-d;j>=0&&temp<s.a[j];j=j-d)
s.a[j+d]=s.a[j];
s.a[j+d]=temp;
}
}
}
void Process::s_bsort(Sample &s)
{
int temp;
for(int i=0;i<s.n-1;i++)
for(int j=i+1;j<s.n;j++)
if(s.a[i]>s.a[j])
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
}
}
int Process::s_psort(Sample &s,int first,int end)
{
int i=first,j=end,temp;
while(i<j)
{
while(i<j&&s.a[i]<=s.a[j])
j--;
if(i<j)
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
i++;
}
while(i<j&&s.a[i]<=s.a[j])
i++;
if(i<j)
{
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
j--;
}
}
return i;
}
void Process::s_qsort(Sample &s,int first,int end)
{
int p;
if(first<end)
{
p=s_psort(s,first,end);
s_qsort(s,first,p-1);
s_qsort(s,p+1,end);
}
}
void Process::s_selsort(Sample &s)
{
int temp,temp2;
for(int i=0;i<s.n-1;i++)
{
temp=i;
for(int j=i+1;j<s.n;j++)
if(s.a[temp]>s.a[j])
temp=j;
temp2=s.a[i];
s.a[i]=s.a[temp];
s.a[temp]=temp2;
}
}
void Process::sift(int k,int m,Sample &s)
{
int i=k,j=2*i+1,temp;
while(j<m)
{
if(j<m-2&&s.a[j]<s.a[j+1])// 体会j<m
j++;
if(s.a[i]>=s.a[j]) break;
else {
temp=s.a[i];
s.a[i]=s.a[j];
s.a[j]=temp;
i=j;
j=2*j+1;
}
}
}
void Process::s_hsort(Sample &s)
{
int temp;
for(int i=(s.n-1)/2;i>=0;i--)
sift(i,s.n,s);
for(int j=0;j<s.n-1;j++)
{
temp=s.a[0];
s.a[0]=s.a[s.n-j-1];
s.a[s.n-j-1]=temp;
sift(0,s.n-j-1,s);
}
}
void Process::getdata(Sample &s)
{
cout<<"元素个数:";
cin>>s.n;
for(int i=0;i<s.n;i++)
{
cout<<"输入第"<<i+1<<"个数据:";
cin>>s.a[i];
}
}
void Process::disp(Sample &s)
{
for(int i=0;i<s.n;i++)
cout<<s.a[i]<<" ";
cout<<endl;
}
int main()
{
int sel;
Sample s;
Process p;
p.getdata(s);
cout<<"原来序列:";
p.disp(s);
cout<<"1:插入排序 2:希尔排序 3:冒泡排序 4:快速排序 5:选择排序 6:堆排序 "<<endl;
cout<<"选择排序方法:";
cin>>sel;
switch(sel)
{
case 1:
p.s_isort(s);
cout<<"插入排序:";
break;
case 2:
p.s_ssort(s);
cout<<"希尔排序:";
break;
case 3:
p.s_bsort(s);
cout<<"冒泡排序:";
break;
case 4:
p.s_qsort(s,0,sel-1);
cout<<"快速排序:";
break;
case 5:
p.s_selsort(s);
cout<<"选择排序:";
break;
case 6:
p.s_hsort(s);
cout<<"堆排序:";
break;
}
p.disp(s);
return 0;
}