数据结构实验4报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
任课教师:孙树森
《数据结构与算法》
(2012-2013学年第2学期)
实
验
报
告
学号:2011329700214
姓名:周咪咪
班级:11数字媒体技术(2)班
实验4快速排序
一、实验目的和要求
1 在掌握各种排序方法的排序过程的基础上,完成快速排序算法程序设计。
2 能够对排序算法进行基本的复杂度分析。
二、实验内容
排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。
快速排序
在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。快速排序函数原型QuickSort(SeqList sq)。
设计一个算法,在顺序表存储结构上实现快速排序。排序数据为学生的考试成绩单。成绩单由学生的学号、姓名和成绩组成,设计一个程序对给定的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
using namespace std;
#define MaxSize 100 //定义顺序表的最大长度
typedef int DataType;//定义模板为整型数据
class CRecord //定义一个记录类,用来存放每一个学生信息中包含的数据
{
public:
int num;
char name[10];
int grade;
};
class SeqList{ //定义一个表格类,存放记录类中的信息,顺序表的长度和一个中间存储单位temp
public:
CRecord * data;
CRecord * temp;
int length;
};
//创建顺序表
void SLCreat(SeqList &sq)
{
sq.length = 0; //初始化顺序表长度为0
cout <<"请输入数据元素数:";
cin>>sq.length; //输入顺序表长度
sq.data= new CRecord[sq.length];//开辟data空间
sq.temp= new CRecord[sq.length];//开辟temp空间
cout <<"请输入数据元素值: "< cout <<"学号姓名成绩: "< for(int i = 0; i < sq.length; i++)//依次输入数据到顺序表中data的相对位置 { cin >> sq.data[i].num>>sq .data[i].name>>sq. data[i].grade; } } //一次快速排序 int partition(SeqList &list, int i, int j) { DataType pivotkey;//定义关键字 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 < j) { while(i < j&&list.data[j].grade >= pivotkey) //当j(顺序表中后者)中成绩大于等于pivotkey时 --j;//j值减少1取向向前的数据 list.data[i] = list.data[j];//将比枢轴记录小的记录交换到低位,把i中数据放到j指向的位置,即j-1 while(i < j&&list.data[i].grade <= pivotkey) //当i(顺序表中后者)中成绩小于等于pivotkey时 ++i;//i值加1取向向后的数据 list.data[j] = list.data[i];;//将比枢轴记录大的记录交换到高位,把j中数据放到i指向的位置,即i-1 } list.data[i]=list.temp[0];//完成交换 return i; } //快速排序,实现顺序表的完整排序 void QuickSort(SeqList & sq, int low, int high) { int pos; if(low < high) { pos = partition(sq,low, high); QuickSort(sq,low, pos-1); QuickSort(sq, pos+1, high); } } //排序 void Sort( SeqList & sq ) { QuickSort(sq,0,sq.length-1);//定义low指针指向list.data[0].grade,hige指针指向