实验八排序.doc

上传人:laozhun 文档编号:2888302 上传时间:2023-03-01 格式:DOC 页数:6 大小:44.50KB
返回 下载 相关 举报
实验八排序.doc_第1页
第1页 / 共6页
实验八排序.doc_第2页
第2页 / 共6页
实验八排序.doc_第3页
第3页 / 共6页
实验八排序.doc_第4页
第4页 / 共6页
实验八排序.doc_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《实验八排序.doc》由会员分享,可在线阅读,更多相关《实验八排序.doc(6页珍藏版)》请在三一办公上搜索。

1、实验八排 序一、 实验目的和要求1 掌握各种排序方法的排序过程。2 了解一些排序算法的实现(如插入排序、选择排序、冒泡排序、快速排序、堆排序等)。二、 基本概念排序就是把一组元素按照某个域的值的递增或递减的次序重新排列的过程。(1) 直接插入排序首先令排序表中的第1个记录有序,然后将第2个记录插入到有序表中合适位置,有序表就增加到了两个元素。再将第3个记录插入到有序表中的合适位置,依此类推,直到表中元素全部有序。(2)希尔排序取一个整数d,将全部记录n分为d个子序列,将所有距离为d的记录放在同一个子序列中;在每个子序列内分别施行直接插入排序;然后缩小间隔d,重复上述子序列划分和排序,直到最后取

2、 d = = 1,将所有记录放在同一个序列中排序为止。 (3) 简单选择排序首先在所有的记录中选出关键字最小的记录,把它与第一个记录交换,然后在其余的记录中再选出关键字最小的记录,与第二个记录交换,依次类推,直到所有记录排序完成。(4)冒泡排序在待排序的记录序列中,从第一个待排序记录开始,依次比较两个相邻记录的关键字,如果是反序,则将两个记录进行交换。这样,在一趟比较完毕后,关键字最大的记录就被交换到最后。然后对前面n-1记录执行上述过程。(5)快速排序在待排序记录序列中任取一个记录作为枢轴,以它作为比较的“基准”,将待排序划分为左右两个子序列,使行左边子序列中记录的关键字均小于等于枢轴,右边

3、子序列中各记录的关键字都大于等于枢轴。对所划分的两组分别重复上述过程,直到各个序列的记录个数为1时为止。三、 程序例题例题8.1 编写一程序要求能够实现直接插入排序、希尔排序、简单选择排序、冒泡排序和快速排序,并用测试函数对其进行测试。算法设计:根据题目要求,设计5个排序函数,实现各种排序功能。(1) 直接插入排序函数InsSort( ):设计思想,首先令排序表中的第1个记录有序,然后将第2个记录插入到有序表中合适位置,有序表就增加到了两个元素。再将第3个记录插入到有序表中的合适位置,依此类推,直到表中元素全部有序。(2) 希尔排序函数ShellSort( ):设计思想,取一个整数d,将全部记

4、录n分为d个子序列,将所有距离为d的记录放在同一个子序列中;在每个子序列内分别施行直接插入排序;然后缩小间隔d,重复上述子序列划分和排序,直到最后取 d = = 1,将所有记录放在同一个序列中排序为止。(3) 简单选择排序函数SelectSort( ):首先在所有的记录中选出关键字最小的记录,把它与第一个记录交换,然后在其余的记录中再选出关键字最小的记录,与第二个记录交换,依次类推,直到所有记录排序完成。(4)冒泡排序函数BubbleSort( )。(5)快速排序函数QuickSort(int low, int high)。算法实现:#include iostream.h#define Max

5、Size 100typedef int DataType;class SeqList DataType listMaxSize; int length;public: SeqList( ) length = 0; void SLCreat(int n); /创建顺序表 void InsSort( ); /直接插入排序 void ShellSort( ); /希尔排序 void SelectSort( ); /简单选择排序 void BubbleSort( ); /冒泡排序 void QuickSort( ); /快速排序 void QuickSort(int low, int high); /

6、快速排序 int partition(int i, int j); void SLPrint( ); /将顺序表显示在屏幕上;/创建顺序表void SeqList:SLCreat(int n); DataType x; length = 0; cout 请输入数据元素值: ; for(int i = 0; i x; listi = x; length+; /直接插入排序void SeqList:InsSort( ) SLCreat(5); DataType x; int i, j; for(i = 0; i = 0; j-)if(x listj)listj+1 = listj;else bre

7、ak;listj+1 = x; cout = 1; d/= 2) /按不同分量进行排序 for(i = d; i = 0; j-= d) if(x listj) list j+d = listj; else break; listj+d = x; cout 希尔排序结果: ; SLPrint( );/简单选择排序void SeqList:SelectSort( ) SLCreat(5); DataType x; inti, j, k; for(i = 0; i length; i+) k = I; /用保存当前得到的最小排序码元素的下标,初值为I for(j = i+1; j length;

8、j+) /从当前排序区间中顺序查找出具有最小排序码的元素listk if(listjlistk)k = j; if(k!=i) /把listk对调到该排序区间的第一个位置 x = listi; listi = listk; listk = x; cout 简单选择排序结果: ; SLPrint( );/冒泡排序void SeqList:BubbleSort( ) SLCreat(5); DataType x; int i, j, flag; for(i = 1; i = i; j-)if(listj listj-1) x = listj-1; listj-1 = listj; listj =

9、x; flag = 1; if(flag = = 0) return; cout 冒泡排序结果: ; SLPrint( );/快速排序void SeqList:QuickSort( ) SLCreat(5); QuickSort(0, 4); cout 快速排序结果: SLPrint( );/快速排序void SeqList:QuickSort(int low, int high) int pos; if(low high) pos = partition(low, high); QuickSort(low, pos-1); QuickSort(pos+1, high); int SeqLis

10、t:partition(int i, int j) DataType pivotkey; pivotkey = listi; while(i j) while(i = pivotkey) -j; if(i j) listi+ = listj; while(i j&listi = pivotkey) +i; if(i j) listj- = listi; listi = pivotkeyl return i;/将顺序表显示在屏幕上void SeqList:SLPrint( ) for(int i = 0; i length; i+) cout listi ; cout endl;void mai

11、n( ) SeqList myList1, myList2, myList3, myList4, myList5; int ch, flag = 1; while(flag_ cout endl; cout 1. 直接插入排序n; cout 2. 希尔排序n; cout 3. 简单选择排序n; cout 4. 冒泡排序n; cout 5. 快速排序n; cout 6. 退出n; cout ch; switch(ch) case 1:myList1.InsSort( ); break; case 2:myList2.ShellSort( ); break; case 3:myList3.SelectSort( ); break; case 4: myList4.BubbleSort( ); break; case 5: myList5.QuickSort( ); break; case 6” flag = 0; break; 程序运行结果: 三、 实验题目1 设计一个算法,在单链表存储结构上实现冒泡排序。2 学生的考试成绩表由学生的学号、姓名和成绩组成,设计一个程序对给定的n个学生信息实现:1)按分数高低次序,打印出每个学生在考试中的排名,分数相同的为同一名次,同一名次的学生按学号从小到大排列。2)按照名次列出每个学生的名次、学号、姓名和成绩。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号