七种排序方法.docx
- 文档编号:10939659
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:21
- 大小:17.99KB
七种排序方法.docx
《七种排序方法.docx》由会员分享,可在线阅读,更多相关《七种排序方法.docx(21页珍藏版)》请在冰豆网上搜索。
七种排序方法
#include
#include
//#include
#include
#defineL5//排序元素个数
#defineFALSE0
#defineTRUE1
//usingnamespacestd;
intnum;
intyum;
intsum;
intsun;
typedefstructRecTypes//用户定义结构体
{
intkey;//关键字
}RecType;//记录类型
RecTypeR[L];
//定义排序趟数的全局变量
voidBubblesort();
voidQuicksort(intlow,inthigh);
voidInsertsort();
voidShellsort();
voidSelectsort();
voidHeap();
voidMerge(intlow,intmm,inthigh,int*x,int*y);
voidMergesort();//二路归并排序
voidvv();
//主函数
intmain()
{
RecTypeS[L+1];
//SeqlistS;
inti,k;
charch1,ch2,q;
printf("\n\t\t★排序算法实现与演示系统★\n\n\t\t请输入%d个待排序的数据:
",L);
for(i=1;i<=L;i++)
{
scanf("%d",&S[i].key);
getchar();
printf("\t\t");
}
ch1='y';
while(ch1=='y')
{
printf("\n");
printf("\n\t\t排序算法\n");
printf("\n\t\t***********************************************\n");
printf("\n\t\t1--------直接插入排序\n");
printf("\n\t\t2--------希尔排序\n");
printf("\n\t\t3--------冒泡排序\n");
printf("\n\t\t4--------快速排序\n");
printf("\n\t\t5--------直接选择排序\n");
printf("\n\t\t6--------堆排序\n");
printf("\n\t\t7--------归并排序\n");
printf("\n\t\t0--------退出\n");
printf("\n\t\t***********************************************\n");
printf("\n\t\t请选择排序算法进行演示:
");
scanf("%c",&ch2);
getchar();
for(i=1;i<=L;i++)
{
R[i].key=S[i].key;
}
switch(ch2)
{
case'1':
Insertsort();
break;
case'2':
Shellsort();
break;
case'3':
Bubblesort();
break;
case'4':
vv();
break;
case'5':
Selectsort();
break;
case'6':
Heap();
break;
case'7':
Mergesort();
break;
case'0':
ch1='n';
break;
default:
system("cls");//清屏
printf("\n\t\t对不起,您输入有误,请重新输入!
\n");
break;
}
if(ch2!
='0')
{
if(ch2=='2'||ch2=='3'||ch2=='4'||ch2=='5'||ch2=='6'||ch2=='7'||ch2=='8')
{
printf("\n\n\t\t排序完毕!
");
printf("\n\t\t按回车键继续!
");
q=getchar();
if(q!
='\n')
{
ch1='n';
}
}
}
}
return1;
}
vv()
{printf("\n\t\t原始数据为:
\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
printf("\n");
yum=0;sun=0;sum=0;
Quicksort(1,L);
printf("\n\t\t排序最终结果是:
\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
printf("\n\t\t比较次数是:
%d\n\t\t",sum);
printf("\n\t\t交换次数是:
%d\n\t\t",sun);
}
voidBubblesort()
{
inti,j,k,x=0,y=0,m=0;
intexchange=TRUE;//标志位exchange初始化为TRUE1
printf("\n\t\t原始数据为:
\n\t\t");
for(k=1;k<=L;k++)
{
printf("%5d",R[k].key);
}
printf("\n");
for(i=1;i { exchange=FALSE; for(j=1;j<=L+1-i;j++)//内层相邻记录的交换与比较 { m++;//比较次数++ if(R[j].key { R[0].key=R[j].key; R[j].key=R[j-1].key; R[j-1].key=R[0].key; exchange=TRUE; y++;//移动次数++ } } m--;//比较次数 if(exchange)//输出语句 { printf("\t\t第%d趟冒泡排序的结果为: \n\t\t",i); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); } } printf("\n\t\t比较次数是: \t\t"); printf("%d",m); printf("\n\t\t移动次数是: \t\t"); printf("%d",y); printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } } voidQuicksort(intlow,inthigh)//该程序为快速算法实现 { inti=low,j=high,k,t;//用变量i,j记录待排序记录首尾位置 t=R[low].key;//以子表的第一个记录做关键字,将其记录暂存到R[0]中 if(i>j)return; while(i { while((i { j--; sum++; } if(i {R[0].key=R[i].key; R[i].key=R[j].key;//将比关键字小的记录移到移到低端 R[j].key=R[0].key; sun++; } while(i { i++; sum++; } if(i {R[0].key=R[i].key; R[i].key=R[j].key;//将比关键字大的记录移到高端 R[j].key=R[0].key; sun++; } } R[j].key=R[i].key; yum++; printf("\t\t第%d趟快速排序的结果为: \n\t\t",yum); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); //输出语句包括排序的结果及次数 Quicksort(low,j-1);//对左侧子序列进行快速排序 Quicksort(j+1,high);//对右侧子序列进行快速排序 } voidInsertsort() { inti,j,k,m=0,x=0;//初始化比较次数变量m,移动次数变量x printf("\n\t\t原始数据为: \n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); //主要运行部分 for(i=2;i<=L;i++) { if(R[i].key { R[0]=R[i]; j=i-1; while(R[0].key { R[j+1]=R[j]; j--; } R[j+1]=R[0]; x++; } m++; //输出语句包括排序的结果及次数 printf("\t\t第%d趟直接插入排序的结果为: \n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); } printf("\n"); printf("\n\t\t比较次数是: \t\t"); printf("%d",m); printf("\n\t\t移动次数是: \t\t"); printf("%d",x); printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } } voidShellsort() { inti,j,gap,x,k,y=0,m=0;//初始化比较次数变量m,移动次数变量y printf("\n\t\t原始数据为: \n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); //函数主要部分 gap=L/2; while(gap>0) { for(i=gap+1;i<=L;i++)//从第gap+1个元素开始,将所有元素有序插入相应分组中 { j=i-gap;//向前找插入位置 while(j>0)//对相隔gap位置的元素进行排序 { if(R[j].key>R[j+gap].key) { x=R[j].key;//交换语句 R[j].key=R[j+gap].key; R[j+gap].key=x; j=j-gap; y++;//移动次数++ } else { j=0; } } } gap=gap/2;//缩小增量 m++;//比较次数++ //输出语句包括排序的结果及次数 printf("\t\t第%d趟希尔排序的结果为: \n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); } printf("\n\t\t比较次数是: \t\t"); printf("%d",m); printf("\n\t\t移动次数是: \t\t"); printf("%d",y); printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } voidSelectsort() { inti,j,k,h,x=0,y=0; printf("\n\t\t原始数据为: \n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); for(i=1;i { h=i; for(j=i+1;j<=L;j++) { x++;//比较次数 if(R[j].key { h=j;//确定最小值 } } if(h! =i) { R[0].key=R[i].key; R[i].key=R[h].key; R[h].key=R[0].key; y++;//移动次数 } printf("\t\t第%d趟选择排序的结果为: \n\t\t",i); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); } //输出语句包括排序的结果及次数 printf("\n\t\t比较次数: %d",x); printf("\n\t\t移动次数: %d",y); printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); } voidMerge(intlow,intmm,inthigh,int*x,int*y)//两个有序序列的合并 { inti=low,j=mm+1,p=0; RecType*R1;//i对第一个开始到结尾,j从第二个开始到结尾 R1=newRecType[high-low+1]; if(! R1) { printf("内存不足! "); } while(i<=mm&&j<=high)//两序列从起始位置开始将小的元素放入到R1中 { R1[p++]=(R[i].key<=R[j].key)? R[i++]: R[j++]; (*x)++; (*y)++; } while(i<=mm)//第二段结束,剩余放入R1中 { R1[p++]=R[i++]; (*y)++; } while(j<=high)//第二段剩余,剩余放入R1中 { R1[p++]=R[j++]; (*y)++; } for(p=0,i=low;i<=high;p++,i++)//剩余元素放入R1中,赋予R { R[i]=R1[p]; (*y)++; } } voidMergePass(intlength,int*x,int*y)//一次二路归并排序 { inti; for(i=1;i+2*length-1<=L;i=i+2*length) { Merge(i,i+length-1,i+2*length-1,x,y);//函数调用 } if(i+length-1 { Merge(i,i+length-1,L,x,y);//函数调用 } } //归并排序 voidMergesort()//二路归并排序 { intlength,k,m=0,i,x=0,y=0; printf("\n\t\t原始数据为: \n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); for(length=1;length { MergePass(length,&x,&y); m++;//输出语句包括排序的结果及次数 printf("\t\t第%d趟归并排序的结果为: \n\t\t",m); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); } printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); printf("\t\t比较次数: %d\n",x); printf("\t\t移动次数: %d\n",y); } voidCreateHeap(introot,intindex,int*x,int*y) { intj,temp,finish; j=2*root;//j指向左孩子 temp=R[root].key; finish=0; while(j<=index&&finish==0) { if(j { if(R[j].key { j++; } }//指向较大的孩子 if(temp>=R[j].key) { finish=1; } else { R[j/2].key=R[j].key; (*y)++; j=j*2; } *x=*x+2; } R[j/2].key=temp; (*y)++; } //堆排序 voidHeapsort() { inti,j,temp,k,x=0,y=0; for(i=(L/2);i>=1;i--)//建立初始堆 { CreateHeap(i,L,&x,&y); } x=0; y=0; for(i=L-1,k=1;i>=1;i--,k++)//将堆中根节点和最后一个节点交换 { temp=R[i+1].key; R[i+1].key=R[1].key; R[1].key=temp; CreateHeap(1,i,&x,&y); printf("\t\t第%d趟堆排序的结果为: \n\t\t",k); for(j=1;j<=L;j++) { printf("%5d",R[j].key); } printf("\n"); } printf("\n\t\t比较次数是: %d\t\t",x); printf("\n\t\t移动次数是: %d\t\t",y); } voidHeap() { inti; printf("\n\t\t原始数据为: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); Heapsort(); printf("\n\t\t排序最终结果是: \n\t\t"); for(i=1;i<=L;i++) { printf("%5d",R[i].key); } printf("\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 排序 方法