#include
#include
#include
using namespace std;
#define random(x) (rand()%100)
int a[15],n;
void BubbleSort(){
int cmp=0,exc=0;
for(int i=0;i<n;i++){
int x=0;
for(int j=0;j<n-1-i;j++){
cmp++;
if(a[j]>a[j+1]){
exc++;
x++;
swap(a[j],a[j+1]);
}
}
if(x==0) break;
}
printf("-----BubbleSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
void SelectionSort(){
int cmp=0,exc=0;
int index;
for(int i=0;i<n-1;i++){
index=i;
for(int j=i+1;j<n;j++){
cmp++;
if(a[j]<a[index]){
index=j;
}
}
if(index!=i) {
swap(a[i],a[index]);
exc++;
}
}
printf("-----SelectionSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
void InsertSort(){
int cmp=0,exc=0;
int i,j,tmp;
for(i=1;i<n;i++){
cmp++;
if(a[i]<a[i-1]){
tmp=a[i];
for(j=i-1;j>=0&&tmp<a[j];j--){
cmp++;
a[j+1]=a[j];
exc++;
}
a[j+1]=tmp;
}
}
printf("-----InsertSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
void ShellSort(){
int cmp=0,exc=0;
for(int len=n/2;len>0;len/=2){
for(int i=len;i<n;i++){
int tmp=a[i],j;
for(j=i-len;j>=0&&tmp<a[j];j-=len){
cmp++;
a[j+len]=a[j];
exc++;
}
cmp++;
a[j+len]=tmp;
}
}
printf("-----ShellSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
int QuickPos(int l,int r,int &cmp,int &exc){
int tmp=a[r];
int i=l;
for(int j=l;j<r;j++){
cmp++;
if(a[j]<tmp){
swap(a[i],a[j]);
exc++;
i++;
}
}
swap(a[i],a[r]);
return i;
}
void QuickSort(int l,int r,int &cmp,int &exc){
if(l<r){
int tmp=QuickPos(l,r,cmp,exc);
QuickSort(l,tmp-1,cmp,exc);
QuickSort(tmp+1,r,cmp,exc);
}
}
void QuickSortP(int l,int r){
int cmp=0,exc=0;
QuickSort(l,r,cmp,exc);
printf("-----QuickSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
void MergeSort(int l,int r,int &cmp,int &exc){
if(l>=r) return;
int len=r-l+1;
int mid=(l+r)/2;
int st1=l,end1=mid,st2=mid+1,end2=r;
MergeSort(st1,end1,cmp,exc);
MergeSort(st2,end2,cmp,exc);
int i=0;
int *tmp=(int *)malloc(len*sizeof(int));
while(st1<=end1&&st2<=end2){
cmp++;
exc++;
tmp[i++]=a[st1]<a[st2]?a[st1++]:a[st2++];
}
while(st1<=end1) tmp[i++]=a[st1++];
while(st2<=end2) tmp[i++]=a[st2++];
for(int k=l,i=0;k<=r;k++,i++){
a[k]=tmp[i];
}
free(tmp);
}
void MergeSortP(int l,int r){
int cmp=0,exc=0;
MergeSort(l,r,cmp,exc);
printf("-----MergeSort-----\n");
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}
printf("\n");
printf("比较:%d 交换:%d\n",cmp,exc);
}
void init1(){
for(int i=0;i<n;i++){
a[i]=i+5;
}
}
void init2(){
for(int i=0;i<n;i++){
a[i]=25-i;
}
}
void init3(){
for(int i=0;i<n;i++){
a[i]=random(100);
}
}
int main()
{
printf("请输入个数:");
cin>>n;
printf("\n-----正序-----\n\n");
init1();
BubbleSort();
init1();
SelectionSort();
init1();
InsertSort();
init1();
ShellSort();
init1();
QuickSortP(0,n-1);
init1();
MergeSortP(0,n-1);
printf("\n-----逆序-----\n\n");
init2();
BubbleSort();
init2();
SelectionSort();
init2();
InsertSort();
init2();
ShellSort();
init2();
QuickSortP(0,n-1);
init2();
MergeSortP(0,n-1);
printf("\n-----随机-----\n\n");
init3();
BubbleSort();
init3();
SelectionSort();
init3();
InsertSort();
init3();
ShellSort();
init3();
QuickSortP(0,n-1);
init3();
MergeSortP(0,n-1);
return 0;
}