急!!!有码神在吗?帮忙看看这段代码哪里出错了
程序代码:
#include<stdio.h> #include<stdlib.h> //#include<list> #include <math.h> #define L 8 //排序元素个数 #define FALSE 0 #define TRUE 1 //using namespace std; typedef struct RecTypes { int key; }RecType; RecType R[L]; int num; int sum; int sun; //定义排序趟数的全局变量 void Bubblesort(); void Quicksort(int low,int high); void Insertsort(); void Shellsort(); void Selectsort(); void Heap(); void Merge(int low,int mm,int high,int *x,int *y); void Mergesort(); //二路归并排序 //主函数 int main() { RecType S[L+1]; //Seqlist S; int i,k; char ch1,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\t 1--------直接插入排序 \n"); printf("\n\t\t 2--------希尔排序 \n"); printf("\n\t\t 3--------冒泡排序 \n"); printf("\n\t\t 4--------快速排序 \n"); printf("\n\t\t 5--------直接选择排序 \n"); printf("\n\t\t 6--------堆排序 \n"); printf("\n\t\t 7--------归并排序 \n"); printf("\n\t\t 0--------退出 \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': printf("\n\t\t原始数据为:\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); num=0;sun=0;sum=0; Quicksort(0,L); printf("\n\t\t排序最终结果是:\n\t\t"); for(k=0;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); 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'; } } } } return 1; } void Bubblesort() { int i,j,k,x=0,y=0,m=0; int exchange=TRUE;//标志位exchange初始化为TRUE 1 printf("\n\t\t原始数据为:\n\t\t"); for(k=1;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); for(i=1;i<L&&exchange==TRUE;i++)//外层对总的循环次数执行次数 { exchange=FALSE; for(j=1;j<=L+1-i;j++) //内层相邻记录的交换与比较 { m++;//比较次数++ if(R[j].key<R[j-1].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); } } void Quicksort(int low,int high)//该程序为快速算法实现 { int i=low,j=high,k; R[0].key=R[low].key; while(i<j) { while(i<j&&R[0].key<=R[j].key) //右侧扫描 { j--; sum++; } if(i<j) { R[i].key=R[j].key;//交换 i++; sun++; } while(i<j&&R[i].key<R[0].key)//左侧扫描 { i++; sum++; } if(i<j) { R[j].key=R[i].key;//交换 j--; sun++; } } R[i].key=R[0].key; num++; //输出语句包括排序的结果及次数 printf("\t\t第%d趟快速排序的结果为:\n\t\t",num); for(k=0;k<=L;k++) { printf("%5d",R[k].key); } printf("\n"); if(low<i-1) Quicksort(low,i-1);//递归部分(左侧) if(j+1<high) Quicksort(j+1,high);//递归部分(右侧) } void Insertsort() { int i,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[i-1].key) { R[0]=R[i]; j=i-1; while(R[0].key<R[j].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); } } void Shellsort() { int i,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++) { j=i-gap; while(j>0) { 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"); } void Selectsort() { int i,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<L;i++) { h=i; for(j=i+1;j<=L;j++) { x++; //比较次数 if(R[j].key<R[h].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"); } void Merge(int low,int mm,int high,int *x,int *y)//两个有序序列的合并 { int i=low,j=mm+1,p=0; RecType *R1; //i对第一个开始到结尾,j从第二个开始到结尾 R1=new RecType[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)++; } } void MergePass(int length,int *x,int *y)//一次二路归并排序 { int i; 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<L) { Merge(i,i+length-1,L,x,y); //函数调用 } } //归并排序 void Mergesort() //二路归并排序 { int length,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<L;length*=2) { 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); } void CreateHeap(int root,int index,int *x,int *y) { int j,temp,finish; j=2*root; //j指向左孩子 temp=R[root].key; finish=0; while(j<=index&&finish==0) { if(j<index) { if(R[j].key<R[j+1].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)++; } //堆排序 void Heapsort() { int i,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); } void Heap() { int i; 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"); }