1、2 能够对排序算法进行基本的复杂度分析。二、 实验内容排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。快速排序在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边子序列中各记录的关键字都大于等于枢轴。对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。快速排序函数原型QuickSort(SeqList sq)。设计一个算法,在顺序表存储结构上实现快速排序。排序数据为学生的考试成绩单。成绩单由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生的成绩单按照名次列打印出每个
2、学生的名次、学号、姓名和成绩。三、实验步骤1输入待排序的记录2. 对自定义记录类型重载比较运算符3 排序1)并选择第一个记录作为pivotkey记录2)从high指向的记录开始,向前找到第一个关键字的值小于Pivotkey的记录,将其放到low指向的位置,low+13).从low指向的记录开始,向后找到第一个关键字的值大于Pivotkey的记录,将其放到high指向的位置,high-14)重复2),3),直到low=high,将枢轴记录放在low(high)指向的位置 5)重复2),3),4),直到整个记录有序为止6) 输出排序记录,完成比较。4. 附加要求:不采用运算法重载的方式,而是定义c
3、ompare函数指针,通过传给quicksort函数指针,完成排序。四、实验提示算法实现:成功代码:在存储结构中添加一个CRecord * temp;原来暂存指针移动位置时所指内容,在快速排序函数中利用中间的存储结构list.temp0,实现两个指针的位置改变后所指内容的变化。#includemalloc.hstdio.husing namespace std;#define MaxSize 100 /定义顺序表的最大长度typedef int DataType;/定义模板为整型数据class CRecord /定义一个记录类,用来存放每一个学生信息中包含的数据public:int num;c
4、har name10;int grade;class SeqList /定义一个表格类,存放记录类中的信息,顺序表的长度和一个中间存储单位tempCRecord * data; CRecord * temp;int length;/创建顺序表void SLCreat(SeqList &sq) sq.length = 0; /初始化顺序表长度为0cout sq.length; /输入顺序表长度sq.data= new CRecordsq.length;/开辟data空间sq.temp= new CRecordsq.length;/开辟temp空间请输入数据元素值: endl; cout 学号 姓
5、名 成绩:for(int i = 0; i sq.datai.numsq .datai.namesq. datai.grade;/一次快速排序int partition(SeqList &list, int i, int j) DataType pivotkey;/定义关键字 list.temp0=list.datai;/把list.datai中的数据再存到list.temp0,供交换后使用pivotkey = list.datai.grade;/选择第一个记录作为pivotkey记录,初始化pivotkey为list.datai.grade的成绩while(i j)while(i = piv
6、otkey) /当j(顺序表中后者)中成绩大于等于pivotkey时-j;/j值减少1取向向前的数据list.datai = list.dataj;/将比枢轴记录小的记录交换到低位,把i中数据放到j指向的位置,即j-1list.datai.grade = pivotkey) /当i(顺序表中后者)中成绩小于等于pivotkey时+i;/i值加1取向向后的数据list.dataj = list.datai;/将比枢轴记录大的记录交换到高位,把j中数据放到i指向的位置,即i-1list.datai=list.temp0;/完成交换 return i;/快速排序,实现顺序表的完整排序void Qui
7、ckSort(SeqList & sq, int low, int high)int pos;if(low =0)n+;cout n sq.datai.num sq .datai.namesq. datai.grade cout endl; i-;/主函数void main( )SeqList myList;SLCreat(myList);Sort(myList ); SLPrint(myList );程序分析:(1) 整个程序实现过程,首先是需要定义两个结构体CRecord和SeqList用于定义学生信息和顺序表中信息结构。然后需要创建顺序表输入学生信息包括学生学号,姓名和成绩。接着定义一个
8、快速排序函数 partition实现每交换一对记录时所需操作。再定义QuickSort函数实现完整的快速排序过程,Sort函数设置好low和high指针指向,SLPrint函数实现快速排序后显示的结果。在main函数中,首先定义创建一顺序表myList输入信息,再调用函数实现快速排序后结果。(2)在partition函数中,先将枢轴记录暂存在list.temp0位置上,排序过程中只对list.datai 和list.dataj 的单向移动,直到一趟排序结束后再将枢轴记录移至正确位置上。运行结果:实验心得:此次实验是关于快速排序算法的实现。实验过程中,通过老师所给的代码再加上自己的修改基本掌握了快速排序。实验过程中,虽然遇到了很多困难但是经过自己的修改和老师的帮助完成了实验,希望在接下来的学习中再接再厉更好地掌握数据结构算法设计。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1