当前位置:首页 > 数据结构实验4 排序
实验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函数指针,完成排序。
1
四、实验提示
算法实现:
#include \#define MaxSize 100 typedef int DataType;
class CRecord {
public: int No;
string name; int grade; }
Typdef CRecord DataType;
class SeqList{ public:
CRecord * data; int length; }
//创建顺序表
Void SLCreat(SeqList & sq); { CRecord x; length = 0;
cout <<\请输入数据元素数”; cin>>sq.length;
sq.data= new CRecord[sq.length];
cout <<\请输入数据元素值: no, , name grade \ for(int i = 0; i < n; i++) {
cin >> sq.data[i].no>>sq .data[i].name>>sq. data[i]grade;
} }
//排序
Void Sort( SeqList & sq ) { SLCreat(sq);
QuickSort(sq,0,sq.length); }
//快速排序
void QuickSort(SeqList & sq, int low, int high)
2
{ int pos;
if(low < high) { pos = partition(sq,low, high); QuickSort(sq,low, pos-1); QuickSort(sq, pos+1, high); } }
int partition(SeqList & list, int i, int j) { DataType pivotkey; pivotkey = list[i]; while(i < j)
{ while(i < j&&list[j] >= pivotkey) --j; if(i < j) list[i++] = list[j]; while(i < j&&list[i] <= pivotkey) ++i; if(i < j) list[j--] = list[i]; }
list[i] = pivotkeyl return i; }
//将顺序表显示在屏幕上 void SLPrint(SeqList & sq) {
cout <<\快速排序结果: \
for(int i = 0; i void main( ) { SeqList myList; SLCreat(SeqList &mylist); Sort(mylist ); SLPrint( ); } 3
共分享92篇相关文档