急!!!有码神在吗?帮忙看看这段代码哪里出错了#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");
}
[解决办法]
修改一下这几个//++++++++++++++++++++++++++++++ 标注的地方
RecType R[L+1];//++++++++++++++++++++++++++++++
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 = 1; 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);//递归部分(右侧)
}
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(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);
break;