问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

排序综合

发布网友 发布时间:2022-05-06 10:07

我来回答

1个回答

热心网友 时间:2022-06-29 18:07

//这是我的
#include<fstream>
#include<iostream>
#include<cstdlib>//常用函数
#include<windows.h>
#include<time.h>
#include<iomanip>//格式化输出
using namespace std;
int compare[7],change[7],move[7]; //compare数组是比较次数,change数组是交换次数,move数组是移动次数
class SortableSList
{
public:
SortableSList();
void Reload(); //初始数据函数
void Save_File(); //保存信息
void InsertSort(); //直接插入排序
void SelectSort(); //简单选择排序
void BubbleSort(); //冒泡排序
void QuickSort(); //快速排序
void ShellSort(); //希尔排序
void HeapSort(); //堆排序
void MergeSort(); //两路合并排序
void QuickSort(int left,int right);
void PrintBeforeSort();
void PrintAfterSort();
private:
int Partition(int left,int right);
void InsSort(int h);
void Merge(int left,int mid,int right);
void Min(int i);
int *l;
int n;
int *randarray;
};
SortableSList::SortableSList()
{
cout<<" | 请你输入要排序的数字个数 n : ";
cin>>n;//输入要生成随机数的个数
cout<<" | |"<<endl;
cout<<" |----------------------------------------------------------------------------|"<<endl;
cout<<" | |"<<endl;
cout<<" | 请稍等...... |"<<endl;
l=new int[n];
randarray=new int[n];
for(int i=0;i<n;i++) //随机产生1~10000的数字
l[i]=randarray[i]=rand()%10000;
}

void SortableSList::Reload() //初始数据函数
{
int i;
for(i=0;i<n;i++)
l[i]=randarray[i];

}
void SortableSList::Save_File() //保存信息
{
int i;
ofstream ofile("排序.txt");//文件输出流
for(i=1;i<=n;i++)
ofile<<l[i]<<" ";//读取文件
ofile.close();
ifstream infile("排序.txt");//输入文件对操作
for(i=1;i<=n;i++)
infile>>l[i];
infile.close();
}
//~~~~~~~~~~~~~~~直接插入排序~~~~~~~~~~~~~~~~~~~
void SortableSList::InsertSort()
{
int i,j;
for(i=1;i<n;i++){
int x=l[i];
move[0]++;
for(j=i-1;j>=0&&x<l[j];j--)
{
compare[0]++;
l[j+1]=l[j],change[0]++;
move[0]++;
}
compare[0]++;
l[j+1]=x;
}
}
//~~~~~~~~~~~~~~~简单选择排序~~~~~~~~~~~~~~~~~~~~~
void Swap(int&a,int&b)
{
int e=a;a=b;b=e;
}

void SortableSList::SelectSort()
{
int s;
for(int i=0;i<n-1;i++)
{
s=i;
compare[1]++;
for(int j=i+1;j<n;j++)
if(l[j]<l[s]) s=j;
Swap(l[i],l[s]),move[1]=move[1]+3,change[1]++;
}
}
//~~~~~~~~~~~~~~~快速排序~~~~~~~~~~~~~~~~~~~~~~~~~
int SortableSList::Partition(int left,int right)
{
int i=left,j=right+1;
do{
do
{i++; compare[3]++;}while(l[i]<l[left]);
do
{j--; compare[3]++;}while(l[j]>l[left]);
if(i<j) Swap(l[i],l[j]),change[3]++;
}while(i<j);
Swap(l[left],l[j]),move[3]=move[3]+3,change[3]++;
return j;
}
void SortableSList::QuickSort(int left,int right)
{
if(left<right)
{
int j=Partition(left,right);
QuickSort(left,j-1);
QuickSort(j+1,right);
}
}

void SortableSList::QuickSort()
{

QuickSort(0,n-1);

}
//******************希尔排序**********************
void SortableSList::InsSort(int h)
{

int i,j;
int x;
for(i=h;i<n;i+=h){
x=l[i];
move[4]++;
compare[4]++;
change[4]++;
for(j=i-h;j>=0 && x<l[j];j-=h)
{
compare[4]++;
l[j+h]=l[j];
change[4]++;
move[4]++;
}
l[j+h]=x;
move[4]++;
}
}

void SortableSList::ShellSort()
{

int incr=n,i;
do{
incr=incr/3+1;
for(i=0;i<incr;i++) InsSort(incr);
}while(incr>1);
}
//~~~~~~~~~~~~~~~~~~~冒泡排序~~~~~~~~~~~~~~~~~~~~
void SortableSList::BubbleSort()
{

int i=n-1,k=1,j,last;
while(i>0){
last=0;
for(j=0;j<i;j++)
{
compare[2]++;
if(l[j+1]<l[j])
{
Swap(l[j],l[j+1]);
last=j;
}
move[2]=move[2]+3; //2指各个排序算法的标号,3指移动次数
}
change[2]++;
i=last;
}
}
//~~~~~~~~~~~~~~~~~~~堆排序~~~~~~~~~~~~~~~~~~
void SortableSList::Min(int i){
int m = i;
int s = i<<1;
int t = (i<<1)+1;
if(t>=n){
compare[5]++;
return ;
}
if(l[s]<l[m]){
m = s;
compare[5]++;
change[5]++;
}
if(l[t]<l[m]){
m = t;
compare[5]++;
change[5]++;
}
if(m!=i)
{
move[5]++;
swap(l[m],l[i]);
Min(m);
}
}
void SortableSList::HeapSort(){
for(int i=(n>>1)-1;i>=0;i--){
Min(i);
}
}
//~~~~~~~~~~~~~~~~~~~两路合并排序~~~~~~~~~~~~~~~~~~
void SortableSList::MergeSort()
{

int left,right,mid,size=1; //变量size是子序列的大小,初值为1
while(size<n)
{
left=0;
while(left+size<n)
{
mid=left+size-1;
if(mid+size>n-1)right=n-1;
else right=mid+size;
Merge(left,mid,right);
left=right+1;
}
size*=2; //每趟排序结束时size都乘2
}
}
void SortableSList::Merge (int left,int mid,int right)
{
int*temp=new int[right-left+1];
int i=left,j=mid+1,k=0;
while((i<=mid)&&(j<=right)){
compare[6]++;
if(l[i]<=l[j]) temp[k++]=l[i++],change[6]++;
else temp[k++]=l[j++],move[6]++,change[6]++;
}
while(i<=mid) temp[k++]=l[i++],move[6]++,change[6]++; //将2个子序列 (l[left],...l[mid])和(l[mid+1],...l[right])
//合并为一个有序子序列
while(j<=right) temp[k++]=l[j++],move[6]++,change[6]++;
for(i=0,k=left;k<=right;) l[k++]=temp[i++],move[6]++,change[6]++;
}
//~~~~~~~~~~~~~~~~~~~排序输出~~~~~~~~~~~~~~~~~~
void SortableSList::PrintBeforeSort(){
cout<<"排序前的数组:\n";
for(int i=0;i<n;i++){
cout<<randarray[i]<<" ";
if((i+1)%10==0)cout<<endl;
}
}
void SortableSList::PrintAfterSort(){
cout<<"排序后的数组:\n";
for(int i=0;i<n;i++){
cout<<l[i]<<" ";
if((i+1)%10==0)cout<<endl;
}
}
int main()
{
int i,j;
for(i=0;i<7;i++)//六种排序的循环
{ compare[i]=change[i]=move[i]=0;}
long int spendtime[7];
int range[7];//排名
long int t1,t2,t3,t4,t5,t6,t7,t8,t9,t10,t11,t12,t13,t14;//起始时间,也就是当前时间
int select;
bool a=true;
cout<<" *----------------------------------------------------------------------------*"<<endl;
cout<<" | 各 种 内 排 序 算 法 的 性 能 比 较 |"<<endl;
cout<<" |----------------------------------------------------------------------------|"<<endl;
cout<<" | |"<<endl;
cout<<" | 1-生成目标列表比较各个内排序算法 |"<<endl;
cout<<" | |"<<endl;
//cout<<" | 3-打印排序前和排序后的数组 |"<<endl;
//cout<<" | |"<<endl;
cout<<" | 2-退出系统 |"<<endl;
cout<<" | |"<<endl;
cout<<" |----------------------------------------------------------------------------|"<<endl;
do{
cout<<" | |"<<endl;
cout<<" | 请输入你要选择的操作: ";
cin>>select;
cout<<" | |"<<endl;
if(select==1){
SortableSList d;
d.Save_File();
t1=GetTickCount();
d.InsertSort ();
t2=GetTickCount();
d.Reload();
t3=GetTickCount();
d.SelectSort ();
t4=GetTickCount();
d.Reload();
t5=GetTickCount();
d.BubbleSort ();
t6=GetTickCount();
d.Reload();//恢复到初始数据函数
t7=GetTickCount();
d.QuickSort ();
t8=GetTickCount();
d.Reload();
t9=GetTickCount();
d.ShellSort ();
t10=GetTickCount();
d.Reload();
t11=GetTickCount();
d.HeapSort();
t12=GetTickCount();
d.Reload();
t13=GetTickCount();
d.MergeSort();
t14=GetTickCount();
spendtime[0]=t2-t1;
spendtime[1]=t4-t3;
spendtime[2]=t6-t5;
spendtime[3]=t8-t7;
spendtime[4]=t10-t9;
spendtime[5]=t12-t11;
spendtime[6]=t14-t13;
for(i=0;i<7;i++)//根据花费时间进行排名
{
int t=1;
for(j=0;j<7;j++)

{
if(i!=j)
if(spendtime[i]>spendtime[j]) t++;
}
range[i]=t;
}
cout<<" | |"<<endl;
cout<<" | 总共用时: 约为"<<setw(5)<<spendtime[0]+spendtime[1]+spendtime[2]+spendtime[3]+spendtime[4]<<"毫秒 |"<<endl;
cout<<" |----------------------------------------------------------------------------|"<<endl;
cout<<" | --- 结 果 如 下 --- |"<<endl;
cout<<" |----------------------------------------------------------------------------|"<<endl;
cout<<" |排序的名称"<<setw(3)<<"| 比较次数"<<setw(3)<<"|交换的次数"<<setw(3)<<"|移动的次数"<<setw(3)<<"| 时间(ms) "<<"| 时间排名 "<<setw(3)<<"| 时间复杂度|"<<endl;
cout<<" |----------+---------+----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 插入排序 |"<<setw(8)<<compare[0]<<" |"<<setw(8)<<change[0]<<" |"<<setw(9)<<move[0]<<" |"<<setw(8)<<spendtime[0]<<" |"<<setw(8)<<range[0]<<" |"<<setw(11)<<" n*n |"<<endl;
cout<<" |----------+---------|----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 选择排序 |"<<setw(8)<<compare[1]<<" |"<<setw(8)<<change[1]<<" |"<<setw(9)<<move[1]<<" |"<<setw(8)<<spendtime[1]<<" |"<<setw(8)<<range[1]<<" |"<<setw(11)<<" n*n |"<<endl;
cout<<" |----------+---------|----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 冒泡排序 |"<<setw(8)<<compare[2]<<" |"<<setw(8)<<change[2]<<" |"<<setw(9)<<move[2]<<" |"<<setw(8)<<spendtime[2]<<" |"<<setw(8)<<range[2]<<" |"<<setw(11)<<" n*n |"<<endl;
cout<<" |----------+---------|----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 快速排序 |"<<setw(8)<<compare[3]<<" |"<<setw(8)<<change[3]<<" |"<<setw(9)<<move[3]<<" |"<<setw(8)<<spendtime[3]<<" |"<<setw(8)<<range[3]<<" |"<<setw(11)<<" n*log2n |"<<endl;
cout<<" |----------+---------|----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 希尔排序 |"<<setw(8)<<compare[4]<<" |"<<setw(8)<<change[4]<<" |"<<setw(9)<<move[4]<<" |"<<setw(8)<<spendtime[4]<<" |"<<setw(8)<<range[4]<<" |"<<setw(11)<<" n*log2n |"<<endl;
cout<<" |----------+---------|----------+----------+----------+----------+-----------|"<<endl;
cout<<" | 堆排序 |"<<setw(8)<<compare[5]<<" |"<<setw(8)<<change[5]<<" |"<<setw(9)<<move[5]<<" |"<<setw(8)<<spendtime[5]<<" |"<<setw(8)<<range[5]<<" |"<<setw(11)<<" n*log2n |"<<endl;
cout<<" *----------------------------------------------------------------------------*"<<endl;
cout<<" | 合并排序 |"<<setw(8)<<compare[6]<<" |"<<setw(8)<<change[6]<<" |"<<setw(9)<<move[6]<<" |"<<setw(8)<<spendtime[6]<<" |"<<setw(8)<<range[6]<<" |"<<setw(11)<<" n*log2n |"<<endl;
cout<<" *----------------------------------------------------------------------------*"<<endl;
a=true;
cout<<"\n是否打印排序前和排序后的队列(选1 打印 或 选2 返回)\n";
int sel;
cin>>sel;
if(sel==1){
d.PrintBeforeSort();
d.PrintAfterSort();
}
else if(sel==2){
continue;
}
}
else if(select==2)
{
cout<<" *----------------------------------------------------------------------------*"<<endl;
cout<<" | --- 程 序 结 束 --- |"<<endl;
cout<<" *----------------------------------------------------------------------------*"<<endl;
a=false;
}
else
{
cout<<" | 你的输入有错误,请重新输入! |"<<endl;
cout<<" | |"<<endl;
a=true;
}
}while(a==true);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 综合验光仪的检查结果和插片验光检查结果差异是什么原因导致的? PHEV是什么意思 鬼谷八荒副本传送阵怎么用不了??? B站五月6月份的历史记录看不了了那个时候搜索看的家庭教育视频还有父母控制欲视频,有个视频我忘了收藏? 初中数学家教网,初中数学辅导视频,怎样学好初中数学 手机被偷了可以在别的手机登陆微信吗手机被偷,又忘了微信登录密码,怎么办_百度问一问 普通家庭应如何教育后代? 你认为理想的家庭教育是什么? 父母有权剥夺我上大学的权利么? 家庭教育影响孩子一生 求大学生家教视频 初中生家庭教育怎样培养孩子的良好习惯视频 我曾经在B站搜索看了一些家庭教育视频还有父母控制欲视频,有个视频我忘了收藏? 根据资料中的视频“指导家庭教育”内容,结合相关理论,回答问题:这一现象是什_百度问一问 哪里可以找到家庭教育男讲师视频 OSI/RM的体系结构是目前常用的因特网体系结构吗 面试前准备什么 马桶堵塞要疏通 马桶被堵了有什么办法 卫生间地面重新打了马桶眼如何堵旧眼 河南省第六届大学生艺术展演参演证书有什么用 没有插入算强奸吗 个人交五险和单位交五险有什么区别吗?帮帮忙 个人交五险和单位交五险有什么区别吗帮帮忙 美国发生的康乃狄克鬼屋事件,究竟是怎么回事? 电视台春晚荣誉证书内容怎么写? 荣誉证书的内容 单位交社保和个人交社保有什么区别金额一样吗 老人死了叫什么 太平间闹鬼事件里演乔纳的男孩是谁? 老年人正常死亡叫什么?(填词语) 人们对死亡有多少种叫法?分别适用于哪种身份?有什么来历? 2017年平安寿险金卡额度多少 平安信用卡金卡额度多少? 45周岁以上的人死了叫什么? 老年人正常死亡叫什么?(填两字词语) 贷款申请一半不申请了征信上面会显示查询记录吗 京东优惠券软件叫什么? 京东优惠券哪里可以领取,有像淘宝那样的内部券吗 有过信用贷款记录算有过贷款记录吗