#include<bits/stdc++.h>//万能头文件
using namespace std;
typedef long long ll;
//结构体
struct sort_time{
string name;//排序的名字
int time;//排序消耗的时间
};
bool sort_time_cmp(sort_time a,sort_time b)
{
return a.time<b.time;
}
//1插入排序之 直接插入排序
void insert_sort(vector<int> &v,int length)
{//开动态数组
int i,j,tmp;//tmp中间变量
for(i=1;i<length;i++)//从小到大排序
{
if(v[i]<v[i-1])
{
tmp=v[i];
j=i-1;
do//找v[i]的插入位置
{
v[j+1]=v[j];//将数据大于v[i]的往后移动
j--;
}while(j>=0&&v[j]>tmp);
v[j+1]=tmp;//在j+1处插入v[i]
}
}
}
//2插入排序之 折半插入排序
void bin_insert_sort(vector<int> &v,int length)
{
int i,j,low,high,mid,tmp;
for(i=1;i<length;i++)//从小到大排
{
if(v[i]<v[i-1])
{
tmp=v[i];//给vi保存到tmp
low=0;
high=i-1;
while(low<=high)//在vi[low-high]中查找插入的位置
{
mid=(low+high)>>1;//取中间位置
if(tmp<v[mid])
{
high=mid-1;//插入点在左半区
}
else
{
low=mid+1;//插入点在右半区
}
}//找位置high
for(j=i-1;j>=high+1;j--)//集中进行元素向后移动
{
v[j+1]=v[j];
}
v[high+1]=tmp;//插入tmp
}
}
}
//3希尔排序
void shell_sort(vector<int> &v,int length)
{
int d=1;
while(d<length/3)//设置增量
d=3*d+1;
while(d>=1)
{
for(int i=d;i<length;i++)
{
for(int j=i;j>=d&&v[j]<v[j-d];j-=d)
{
swap(v[j],v[j-d]);//交换函数
}
}
d/=3;// d=d/3减小增量
}
}
//4冒泡排序
void bubble_sort(vector<int> &v,int length)
{
bool flag;
for(int i=0;i<length;i++)
{
flag=false;//刚开始变为假
for(int j=length-1;j>i;j--)//归为v[i],循环length-i-1次
{
if(v[j]<v[j-1])//相邻两个元素反序
{
swap(v[j],v[j-1]);//交换v[j] 和v[j-1]
flag=true;//一旦有交换,flag变为真
}
}
if(!flag)//没有发生交换,结束返回
{
return;
}
}
}
//5快速排序
void quick_sort(vector<int> &v,int l,int r)
{
if(l>=r)
return;
int tmp=v[ (l+r) >>1 ],i=l-1,j=r+1;
while(i<j)
{
do{
i++;
}while(v[i]<tmp);//从左向右扫描,找一个大于tmp的v[i]
do{
j--;
}while(v[j]>tmp);//从右向左扫描,找一个小于tmp的v[j]
if(i<j)
swap(v[i],v[j]);//交换台语tmp的v[i]和小于tmp的v[j]
}
quick_sort(v,l,j);//对左区间递归排序
quick_sort(v,j+1,r);//对右区间递归排序
}
//6选择排序
void select_sort(vector<int> &v,int length)
{//从小到大排
for(int i=0;i<length-1;i++)
{
for(int j=i+1;j<length;j++)
{
if(v[i]>v[j])
swap(v[i],v[j]);//交换
}
}
}
//7堆排序
//(1)构造大根堆
void sift(vector<int> &v,int low,int high)
{
int i=low,j=2*i+1;//v[j]是v[i]的左孩子
int tmp=v[i];
while(j<=high)
{
if(j+1<=high&&v[j]<v[j+1])
{
j++;//若右孩子比较大,把 j 指向右孩子
}
if(v[i]>v[j])
{
break;//若根节点大于等于最大孩子,则筛选结束
}
else//若根节点小于最大孩子的关键字
{
swap(v[i],v[j]);//将v[i]调整到双亲结点的位置上
i=j;//修改i和j的值,以便继续向下筛选
j=i*2+1;
}
}
v[i]=tmp;//被筛选结点放入最终位置
}
//堆排序
void heap_sort(vector<int> &v,int length)
{
for(int i=(length>>1)-1;i>=0;i--)
{
sift(v,i,length-1);
}
for(int i=length-1;i>=0;i--)
{
swap(v[0],v[i]);//将最后一个元素与根v[1]交换
sift(v,1,i-1);//对v[1--i-1]进行筛选,得到i-1个结点的堆
}
}
int main()
{
srand((unsigned)time(NULL));//产生随机数的函数
int length;//随机数
cout<<"输入产生随机数的个数n:"<<endl;
cin>>length;
//开动态数组,存随机数
vector<int> print,insert_array, bin_insert_array, shell_array, bubble_array, quick_array, select_array, heap_array;
for(int i=0;i<length;i++)//产生随机数的过程
{
int t=rand();
insert_array.push_back(t);
bin_insert_array.push_back(t);
shell_array.push_back(t);
bubble_array.push_back(t);
quick_array.push_back(t);
select_array.push_back(t);
heap_array.push_back(t);
print.push_back(t);
}
cout<<"产生n个随机数如下:"<<endl;
for(int i=0;i<length;i++)
{
cout<<print[i]<<" ";
}
cout<<endl;
cout << "随机数生成完毕!\n开始进行排序...\n";
clock_t start; //定时器
sort_time st[8];
start = clock();
insert_sort(insert_array, insert_array.size());
st[0].name = "直接插入排序", st[0].time = clock() - start;
start = clock();
bin_insert_sort(bin_insert_array, bin_insert_array.size());
st[1].name = "折半插入排序", st[1].time = clock() - start;
start = clock();
shell_sort(shell_array, shell_array.size());
st[2].name = "希尔排序", st[2].time = clock() - start;
start = clock();
bubble_sort(bubble_array, bubble_array.size());
st[3].name = "冒泡排序", st[3].time = clock() - start;
start = clock();
quick_sort(quick_array, 0, quick_array.size() - 1);
st[4].name = "快速排序", st[4].time = clock() - start;
start = clock();
select_sort(select_array, select_array.size());
st[5].name = "选择排序", st[5].time = clock() - start;
start = clock();
heap_sort(heap_array, heap_array.size());
st[6].name = "堆排序", st[6].time = clock() - start;
cout<<"直接插入排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<insert_array[i]<<" ";
cout<<endl;
cout<<"折半插入排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<bin_insert_array[i]<<" ";
cout<<endl;
cout<<"希尔排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<shell_array[i]<<" ";
cout<<endl;
cout<<"冒泡排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<bubble_array[i]<<" ";
cout<<endl;
cout<<"快速排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<quick_array[i]<<" ";
cout<<endl;
cout<<"选择排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<select_array[i]<<" ";
cout<<endl;
cout<<"堆排序结果:"<<endl;
for(int i=0;i<length;i++)
cout<<heap_array[i]<<" ";
cout<<endl;
sort(st, st + 8, sort_time_cmp);
cout<<"第一快的排序方法:"<<st[0].name<<"时间消耗:"<<st[0].time<<"ms\n";
cout<<"第二快的排序方法:"<<st[1].name<<"时间消耗:"<<st[1].time<<"ms\n";
cout<<"第三快的排序方法:"<<st[2].name<<"时间消耗:"<<st[2].time<<"ms\n";
cout<<"第四快的排序方法:"<<st[3].name<<"时间消耗:"<<st[3].time<<"ms\n";
cout<<"第五快的排序方法:"<<st[4].name<<"时间消耗:"<<st[4].time<<"ms\n";
cout<<"第六快的排序方法:"<<st[5].name<<"时间消耗:"<<st[5].time<<"ms\n";
cout<<"第七快的排序方法:"<<st[6].name<<"时间消耗:"<<st[6].time<<"ms\n";
return 0;
}