数据结构实验4报告.doc
《数据结构实验4报告.doc》由会员分享,可在线阅读,更多相关《数据结构实验4报告.doc(6页珍藏版)》请在冰豆网上搜索。
任课教师:
孙树森
《数据结构与算法》
(2012-2013学年第2学期)
实
验
报
告
学号:
2011329700214
姓名:
周咪咪
班级:
11数字媒体技术
(2)班
6
实验4 快速排序
一、实验目的和要求
1在掌握各种排序方法的排序过程的基础上,完成快速排序算法程序设计。
2能够对排序算法进行基本的复杂度分析。
二、实验内容
排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。
快速排序
在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。
对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。
快速排序函数原型QuickSort(SeqListsq)。
设计一个算法,在顺序表存储结构上实现快速排序。
排序数据为学生的考试成绩单。
成绩单由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生的成绩单按照名次列打印出每个学生的名次、学号、姓名和成绩。
三、实验步骤
1.输入待排序的记录
2.对自定义记录类型重载比较运算符
3.排序
1)并选择第一个记录作为pivotkey记录
2)从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+1
3).从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,将其放到high指向的位置,high-1
4)重复2),3),直到low=high,将枢轴记录放在low(high)指向的位置
5)重复2),3),4),直到整个记录有序为止
6)输出排序记录
,完成比较。
4.附加要求:
不采用运算法重载的方式,而是定义compare函数指针,通过传给quicksort函数指针,完成排序。
四、实验提示
算法实现:
成功代码:
在存储结构中添加一个CRecord*temp;原来暂存指针移动位置时所指内容,在快速排序函数中利用中间的存储结构list.temp[0],实现两个指针的位置改变后所指内容的变化。
#include
#include
#include
usingnamespacestd;
#defineMaxSize100//定义顺序表的最大长度
typedefintDataType;//定义模板为整型数据
classCRecord//定义一个记录类,用来存放每一个学生信息中包含的数据
{
public:
intnum;
charname[10];
intgrade;
};
classSeqList{//定义一个表格类,存放记录类中的信息,顺序表的长度和一个中间存储单位temp
public:
CRecord*data;
CRecord*temp;
intlength;
};
//创建顺序表
voidSLCreat(SeqList&sq)
{
sq.length=0;//初始化顺序表长度为0
cout<<"请输入数据元素数:
";
cin>>sq.length;//输入顺序表长度
sq.data=newCRecord[sq.length];//开辟data空间
sq.temp=newCRecord[sq.length];//开辟temp空间
cout<<"请输入数据元素值:
"<cout<<"学号姓名成绩:
"< for(inti=0;i {
cin>>sq.data[i].num>>sq.data[i].name>>sq.data[i].grade;
}
}
//一次快速排序
intpartition(SeqList&list,inti,intj)
{
DataTypepivotkey;//定义关键字
list.temp[0]=list.data[i];//把list.data[i]中的数据再存到list.temp[0],供交换后使用
pivotkey=list.data[i].grade;//选择第一个记录作为pivotkey记录,初始化pivotkey为list.data[i].grade的成绩
while(i {
while(i=pivotkey)//当j(顺序表中后者)中成绩大于等于pivotkey时
--j;//j值减少1取向向前的数据
list.data[i]=list.data[j];//将比枢轴记录小的记录交换到低位,把i中数据放到j指向的位置,即j-1
while(i ++i;//i值加1取向向后的数据
list.data[j]=list.data[i];;//将比枢轴记录大的记录交换到高位,把j中数据放到i指向的位置,即i-1
}
list.data[i]=list.temp[0];//完成交换
returni;
}
//快速排序,实现顺序表的完整排序
voidQuickSort(SeqList&sq,intlow,inthigh)
{
intpos;
if(low {
pos=partition(sq,low,high);
QuickSort(sq,low,pos-1);
QuickSort(sq,pos+1,high);
}
}
//排序
voidSort(SeqList&sq)
{
QuickSort(sq,0,sq.length-1);//定义low指针指向list.data[0].grade,hige指针指向list.data[length-1].grade
}
//将顺序表输出显示在屏幕上
voidSLPrint(SeqList&sq)
{
cout<<"快速排序后成绩排列结果:
"<cout<<"名次学号姓名成绩:
"< inti=sq.length-1;
intn=0;
while(i>=0)
{
n++;
cout<<""< cout< i--;
}
}
//主函数
voidmain()
{
SeqListmyList;
SLCreat(myList);
Sort(myList);
SLPrint(myList);
}
程序分析:
(1)整个程序实现过程,首先是需要定义两个结构体CRecord和SeqList用于定义学生信息和顺序表中信息结构。
然后需要创建顺序表输入学生信息包括学生学号,姓名和成绩。
接着定义一个快速排序函数partition实现每交换一对记录时所需操作。
再定义QuickSort函数实现完整的快速排序过程,Sort函数设置好low和high指针指向,SLPrint函数实现快速排序后显示的结果。
在main函数中,首先定义创建一顺序表myList输入信息,再调用函数实现快速排序后结果。
(2)在partition函数中,先将枢轴记录暂存在list.temp[0]位置上,排序过程中只对list.data[i]和list.data[j]的单向移动,直到一趟排序结束后再将枢轴记录移至正确位置上。
运行结果:
实验心得:
此次实验是关于快速排序算法的实现。
实验过程中,通过老师所给的代码再加上自己的修改基本掌握了快速排序。
排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。
在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。
对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。
快速排序函数原型QuickSort(SeqListsq)。
实验过程中,虽然遇到了很多困难但是经过自己的修改和老师的帮助完成了实验,希望在接下来的学习中再接再厉更好地掌握数据结构算法设计。