#include<iostream>
#include<time.h>
#include<windows.h>
#pragma comment(linker,"/subsystem:console")
using namespace std;
const int size=50000;
#pragma once
# define rr 100000;
void InsertSort(int r[],int n)//插入排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int num1=0,num2=0;//记录移动次数和比较次数的参数
for(int i=2;i<=n;i++)
{
int j;
r[0]=r[i];//用哨兵记录待排序的数据
for( j=i-1;r[0]<r[j];j--,num1++)
{
r[j+1]=r[j];
num2=num2+3;
}
num1++;
r[j+1]=r[0];//把数据放入合适的位置
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
void ShellInsert(int r[],int n)//希尔排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int j;int num1=0,num2=0;
for(int d=n/2;d>=1;d=d/2)//增量每次减少一半,最后增量为1
{
for(int i=d+1;i<=n;i++)//相隔d的元素进行比较
{
if(r[i]<r[i-d])
{
r[0]=r[i];
for( j=i-d;j>0&&r[0]<r[j];j=j-d,num1++)
{
r[j+d]=r[j];
num2=num2+3;
}
r[j+d]=r[0];
}
num1++;
}
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
void BubbleSort(int r[],int n)//冒泡排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int pos=n;//pos记录最后一次比较的位置
int num1=0,num2=0;
while(pos!=0)
{
int bound=pos;
pos=0;
for(int i=1;i<bound;i++)
{
num1++;
if(r[i]>r[i+1])
{
r[0]=r[i];r[i]=r[i+1];r[i+1]=r[0];
pos=i;num2=num2+3;
}
}
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
int Partion(int r[],int first,int end,int &num1,int &num2)//快速排序
{
int i=first;int j=end;
int pivot=r[i];//记录轴值
while(i<j)
{
while((i<j)&&(r[j]>=pivot))//从右往左找比轴值小的元素
{j--;num1++;}
r[i]=r[j];if(i!=j)num2=num2+3;
while((i<j)&&(r[i]<=pivot)&&num1++)//从左往右找比轴值大的元素
i++;
r[j]=r[i];if(i!=j)num2=num2+3;
}
r[i]=pivot;
return i;
}
void Qsort(int r[],int i,int j,int &num1,int &num2)//快速排序
{
if(i<j)
{
int pivotloc=Partion(r,i,j,num1,num2);
Qsort(r,i,pivotloc-1,num1,num2);
Qsort(r,pivotloc+1,j,num1,num2);
}
}
void SelectSort(int r[],int n)//简单选择排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int num1=0,num2=0;
for(int i=1;i<n;i++)
{
int index=i;//index记录最小值的位置
for(int j=i+1;j<=n;j++,num1++)
if(r[j]<r[index])
index=j;
if(index!=i)
{
num2=num2+3;
r[0]=r[i];
r[i]=r[index];
r[index]=r[0];
}
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
void Sift(int r[],int k,int m,int &num1,int &num2)//希尔排序
{
int i=k,j=2*i;
while(j<=m)
{
num1++;
if(j<m&&r[j]>r[j+1])
j++;//找到左右孩子中较小者
if(r[i]<r[j]){break;}
else
{
num2=num2+3;
int num=r[i];
r[i]=r[j];
r[j]=num;
i=j;
j=2*i;
}
}
}
void HeapSort(int r[],int n)//堆排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int num1=0,num2=0;
for(int i=n/2;i>=1;i--)
Sift(r,i,n,num1,num2);//建立小根堆
for(int j=1;j<n;j++)//每次输出堆顶元素再建堆
{
num2=num2+3;
int num=r[1];
r[1]=r[n-j+1];
r[n-j+1]=num;
Sift(r,1,n-j,num1,num2);
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=n;k>=1;k--)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
void Merge(int r[],int r1[],int s,int m,int t,int &num1)
{
int i=s;
int j=m+1;
int k=s;
while(i<=m&&j<=t)
{
num1++;
if(r[i]<r[j])
r1[k++]=r[i++];//i和j中较小中进入r1数组
else
r1[k++]=r[j++];
}
if(i<=m)//没有排完部分继续存入数组r1后
while(i<=m) r1[k++]=r[i++];
if(j<=t)
while(j<=t) r1[k++]=r[j++];
}
void MergePass(int r[],int r1[],int n,int h,int &num1)
{
int i=1;
while(i<=n-2*h-1)
{
Merge(r,r1,i,i+h-1,i+2*h-1,num1);
i+=2*h;
}
if(i<n-h+1)
Merge(r,r1,i,i+h-1,n,num1);//剩下两个序列中其中一个个数小于h
else//只剩下一个序列时直接存入
for(;i<=n;i++)
r1[i]=r[i];
}
void MergeSort(int r[],int r1[],int n)//合并排序
{
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
int num1=0;
int h=1;
while(h<n)
{
MergePass(r,r1,n,h,num1);
h=h*2;//h每次倍增
for(int i=1;i<=n;i++)
r[i]=r1[i];
}
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<0<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
}
void menu(int r[],int n)
{
int b[100];int x;
int d[11];
for(int e=1;e<=10;e++)
d[e]=r[e];
system("cls");
cout<<"\t\t---------------------------菜单-----------------------------|\n";
cout<<"\t\t------------------------------------------------------------|\n";
cout<<"\t\t| |\n";
cout<<"\t\t|☆☆☆☆☆ 主菜单 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 1. 插入排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 2. 希尔排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 3. 冒泡排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 4. 快速排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 5. 简单选择排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 6. 堆排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 7. 归并排序 ☆☆☆☆☆|\n";
cout<<"\t\t|☆☆☆☆☆ 8. 退出 ☆☆☆☆☆|\n";
cout<<"\t\t-------------------------------------------------------------\n";
cout<<"\t\t请输入你的选择:";
while(true)
{
cin>>x;
if(!(x>=1&&x<=8))
{
cout<<"请你重新输入你的选择:";
continue;
}
else break;
}
int num1=0,num2=0;
switch(x)
{
case 1:
{ system("cls");
InsertSort(r,n);
cout<<"返回上一层请按1:";
int a1;
cin>>a1;
if(a1==1)
menu(d,n);
break;}
case 2:
{ system("cls");
ShellInsert(r,n);
cout<<"返回上一层请按1:";
int a2;
cin>>a2;
if(a2==1)
menu(d,n);
break;}
case 3:
{ system("cls");
BubbleSort(r,n);
cout<<"返回上一层请按1:";
int a3;
cin>>a3;
if(a3==1)
menu(d,n);
break;}
case 4:
{ system("cls");
LARGE_INTEGER nFreq;
LARGE_INTEGER nBeginTime;
LARGE_INTEGER nEndTime;
double time;
QueryPerformanceFrequency(&nFreq);
QueryPerformanceCounter(&nBeginTime);//记录开始执行时的时间
Qsort(r,1,n,num1,num2);
QueryPerformanceCounter(&nEndTime);
time=(double)(nEndTime.QuadPart-nBeginTime.QuadPart)/(double)nFreq.QuadPart*1000000;
cout<<"排序后的数组为:";
for(int k=1;k<=n;k++)
cout<<r[k]<<" ";
cout<<endl;
cout<<"比较次数为:"<<num1<<endl;
cout<<"移动次数为:"<<num2<<endl;
cout<<"执行时间: "<<time<<"uS"<<endl;
cout<<"返回上一层请按1:";
int a4;
cin>>a4;
if(a4==1)
menu(d,n);
break;}
case 5:
{system("cls");
SelectSort(r,n);
cout<<"返回上一层请按1:";
int a5;
cin>>a5;
if(a5==1)
menu(d,n);
break;}
case 6:
{ system("cls");
HeapSort(r,n);
cout<<"返回上一层请按1:";
int a6;
cin>>a6;
if(a6==1)
menu(d,n);
break;}
case 7:
{ system("cls");
MergeSort(r,b,n);
cout<<"返回上一层请按1:";
int a7;
cin>>a7;
if(a7==1)
menu(d,n);
break;}
case 8:break;
}
}
void put(int m)
{
switch(m)
{
case 1:
{
cout<<"要进行几个数的排序:";
int n;
cin>>n;
int *a=new int [n+1];
cout<<"请输入需要排序的"<<n<<"个数:";
for(int k=1;k<=n;k++)
{
cin>>a[k];
}
menu(a,n);
delete []a;
break;
}
case 2:
{
cout<<"将产生"<<size<<"个随机数"<<endl;
int *b=new int [size+1];
for( int i=1;i<=size;i++)
b[i]=rand()% rr;
menu(b,size);
delete []b;
break;
}
}
}
int main()
{
int c;
cout<<"键盘输入数据-1"<<endl;
cout<<"产生随机数-2"<<endl;
cin>>c;
if(c!=1&&c!=2)
{
cout<<"键盘输入数据-1"<<endl;
cout<<"产生随机数-2"<<endl;
cin>>c;
}
put(c);
return 0;
}
供大家学习