pivotpos=Partition(R,low,high); //对R[low..high]做划分
QuickSort(R,low,pivotpos-1); //对左区间递归排序
QuickSort(R,pivotpos+1,high); //对右区间递归排序
}
} //QuickSort
三、课程设计中遇到的难点及解决办法
问题:如何实现对每趟排序结果的存储、访问?
解决方法:设计一个并行的存储空间(结构体数组),存储每趟排序的结果,通过指针型参数
传递存储空间的地址实现数据的实时存储。
问题:如何实现结构体数组作为参数传递数据,并使数组中的数据可以真实的改变,实现类
似于“&”(引用)应用的功能?
解决方法:运用指针即将结构体数组的首地址作为一个结构体指针进行参数的传递,由于指
针的特性从而实现数据的实时传递!
四、总结
课程设计是巩固所学知识理论,提高程序设计的重要环节,通过课程设计的训练,使我们能够综合应用数据结构的基础知识,加深了对于所学知识的理解,也更加懂得了实践的重要性,也明白了各种算法重要的是理解其原理,而不是死记硬背!同时让我们更加了解自身不足和知识学习缺陷,从而不断完善自我,提高自己的学习水平。在设计过程中我们真正实现了把所学知识运用于实践,逐渐培养自己的思维和逻辑能力以及实践能力,做到学以致用。
五、附录—主要源程序代码及运行结果
#include "stdio.h"
#include "malloc.h"
typedef int elemtype;
typedef struct { //存储排序数据
elemtype *data;
int length;
}list;
typedef struct{ //存储每趟排序数据
elemtype *sqdata;
}sqlist,*linklist;
/*
* 设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个*无序的表,在进行数据交换时,修改flag为0。在新一轮排序开始时,检查*此标志,若此标志为1,表示上一次没有做过交换数据,则结束排序;否则*继续排序;
*/
int maopao(list &l,linklist sql,int x){ //冒泡排序
int flag;
for(int i=1;i<=x;i++){
flag=1; //标记是否有数据交换
for(int j=1;j<=x-i;j++){
if(l.data[j]>l.data[j+1]){
l.data[0]=l.data[j];
l.data[j]=l.data[j+1];
l.data[j+1]=l.data[0];
flag=0;
}
}
for(int m=1;m<=x;m++) //每趟排序结果的存储
sql[i-1].sqdata[m]=l.data[m];
if(1==flag) break;
}
return i-1; //返回排序趟数
}
//直接插入排序
int Insertsort(list &l,linklist sql,int x){
for(int i=2;i<=x;i++){
if(l.data[i]l.data[0]=l.data[i];
for(int j=i-1;l.data[0]l.data[j+1]=l.data[j];
l.data[j+1]=l.data[0];
}
for(int m=1;m<=x;m++) //每趟排序结果的存储
sql[i-2].sqdata[m]=l.data[m];
}
return i-2; //返回排序趟数
}
void q_sort(list &l,int low,int high){ //快速排序(递归)int pivot;
int left,right;
l.data[0]=l.data[low];
left=low;
right=high;
if(low<=high){
while(lowwhile((low=l.data[0]))
high--;
if(low!=high){
l.data[low]=l.data[high];
low++;
}
while((lowlow++;
if(low!=high){
l.data[high]=l.data[low];
high--;
}
}
l.data[low]=l.data[0];
pivot=low;
if(leftq_sort(l,left,high-1); //递归调用
if(right>pivot)
q_sort(l,high+1,right);
}
else
printf("未输入数据!");
}
//访问一遍数据并输出最终排序结果
void traveres(list L,int x){
printf("最终排序结果:");
for(int i=1;i<=x;i++)
printf("%3d",L.data[i]);
printf("\n");
printf("***************************************\n\n"); }
void liststring(list l,linklist sql,int num,int x){ //输出每趟排序结果
int z;
printf("共记录有%d趟排序结果,\n",num);
traveres(l,x);
printf("要查看第几趟排序结果? ");
scanf("%d",&z);
printf("\n");
printf("***************************************\n\n");
printf("第%d趟排序结果为:",z);
for(int a=1;a<=x;a++)
printf("%5d",sql[z-1].sqdata[a]);
printf("\n\n");
}
void main(){ //主函数部分
list l;
int x;
int y;
int num;
linklist sql;
printf("请输入要排序的数据的个数:");
scanf("%d",&x);
if(x==0)
printf("数据个数不能为0 !\n");
else{
l.data=(elemtype *)malloc(x * sizeof(elemtype)); //申请存储空间
sql=(linklist )malloc(x * sizeof(linklist));
for(int q=0;qsql[q].sqdata=(elemtype *)malloc(x * sizeof(elemtype));//申请存储空间printf("请输入要排序的数据:\n");
for(int i=1;i<=x;i++){ //接收数据
printf("请输入第%d个数据:",i);
scanf("%d",&l.data[i]);
}
printf("请输入要使用的排序方法:1、冒泡 2、直接插入排序、3、快速排序\n");
printf("您的选择为:");
scanf("%d",&y);
printf("***************************************\n");
switch(y){
case 1:
printf("您选择了“冒泡排序”\n");
num=maopao(l,sql,x);
liststring(l,sql,num,x);
printf("***************************************\n"); break;
case 2:
printf("您选择了“直接插入排序”\n");
num=Insertsort(l,sql,x);
liststring(l,sql,num,x);
printf("***************************************\n"); break;
case 3:
printf("您选择了“快速排序”\n");
q_sort(l,1,x);
traveres(l,x);
break;
default:
printf("输入错误!");
}
}
printf("按任意键结束!\n\n\n");
}
六、指导老师评语及成绩