1、作业名称: 算法演示程序学 院: 航海学院班 级: 03011403学 号: 2013300951姓 名: 苏和团队组成:西北工业大学2019 年 6 月 21 日程序设计挑战式课程设计报告- 2 -1、问题与背景(描述程序所要解决的问题或应用背景)C 语 言 经过几十年的发展已经发展出多种多样的的排序方法,网上的解释和 代码良莠不齐,许多具有严重的错误,给学习者打来极大的不便。因此,我将目前比较流行的 7 种排序法:1.冒泡排序 2.选择排序 3.插入排序4.快速排序 5 堆排序 6 归并排序7.基数排序加以总结,标明注释,成为这个演示程序,以供交流学习使用。2、开发工具(列出所使用的开发工
2、具和第 3 方开发库)Code:block3、主要功能(详细说明程序的功能)基本功能:本程序可实现对 100 个及以下的数据排列的功能。拓展功能:1.选择不同的排序法进行排序。2.选择数据正序排列,还是逆序排列。4、设计内容(详细描述解决问题的原理和方法、算法、数据结构等)本程序的数据变换主要在数组中进行。1. 冒泡排序相邻两个记录之间进行比较和互换,使较小的记录逐渐从底部移向顶部。一次排序后最大的记录沉底,再比较前 n-1 个记录直到最后一次程序设计挑战式课程设计报告- 3 -排列时只有两个记录。排列结束后最小的记录自然上浮至第一位。2. 选择排序第 i 趟选择排序通过 n-i 次关键码的比
3、较,从 n-i+1 个记录中选出关键码最小的记录,并和记录 i 交换。3. 插入排序把新插入记录的关键码与已排好序的逐个比较,但找到第一个比其大的记录时,该记录之前即为插入位置 k。从序列最后开始到该记录,逐个后移一个单元,将新纪录插入 k 位置。如果新纪录比其他记录都大,则插入到最后。4. 快速排序通过一趟排序将要排序的记录分为两部分,其中一部分比另一部分都要小。再按此方法对两组数据分别进行递归快速排序,从而使序列成为有序序列。5. 堆排序先将初始文件 R1n建成一个大根堆,此堆 为初始的无序区。再将关键字最大的记录 R1(即堆顶) 和无序区的最后一个记录 Rn交换,由此得到新的无序区 R1
4、n-1和有序区 Rn。由于 交换后新的根 R1可能违反堆性质,故应将当前无序区 R1n-1调整为堆。然后再次将R1n-1中关 键字最大的记录 R1和该区间的最后一个记录 Rn-1交换,由此得到新的无序区 R1n-2和有序区 Rn-1n,同样要将 R1n-2调整为堆,直到无序区只有一个元素为止。程序设计挑战式课程设计报告- 4 -6. 归并排序将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路 归并。首先申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列。设定两个 指针,最初位置分别为两个已经排序序列的起
5、始位置。比较两个 指针所指向的元素,选择相对小的元素放入到合并空间,并移 动 指针到下一位置。重复直到某一指针超出序列尾。将另一序列剩下的所有元素直接复制到合并序列尾。7. 基数排序基数排序法又称“桶子法” (bucketsort)或 binsort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶” 中,藉以达到排序的作用。对数据来说,首先根据个位数的数值,在走访数值时将它们分配至编号 0 到 9 的桶子中。接下来将这些桶子中的数值重新串接起来。接着再进行一次分配,这次是根据十位数来分配。接下来将这些桶子中的数值重新串接起来。重复以上过程直到最高位,这时候整个数列已经排序完毕。
6、5、程序文件与工程名称(标出程序中所有文件名、工程名称及其说明)程序设计挑战式课程设计报告- 5 -工程的名称:排序算法演示程序包含的程序原文件如下:1.sort.cpp主函数、输入和输出数据、显示菜单、 选择排序方法2. sort_fun.cpp实现 7 种排序的函数3. myh.h7 种排序函数及其附属函数的声明6、函数模块(程序中各个函数的原型声明及其说明)void Bubble(int a,int n); 冒泡排序void Selection(int a,int n); 选择排序void Insertion(int a,int n); 插入排序void Quick(int a,int
7、n,int left,int right); 快速排序void Shift(int a , int i , int m); 建堆void Heap(int a , int n); 堆排序void MergeSort(int R,int low,int high); 归并排序void Merge(int *R,int low,int m,int high); 元素比较void Bucket(int *p , int n); 基数排序int getLoopTimes(int num); 获取数字的位数int findMaxNum( int *p , int n); 查询数组中的最大数void so
8、rt2(int *p , int n , int loop);程序设计挑战式课程设计报告- 6 -将数字分配到各自的桶中,然后按照桶的顺序输出排序结果7、使用说明(运行程序的小型说明书)1. 打开程序,出现欢迎界面2. 输入所要排序的数据个数(N#include #include “myh.h“int main()int a100,n,i,k;while(1)printf(“nttt 欢迎使用排序算法演示程序nnn“);printf(“ 请输 入所要排序的数据个数 N(N=0;i-) printf(“%d “,ai);/倒序输出printf(“nn 按 Q 键并确认退出,其他任意键继续:“);
9、getchar();if(getchar()=q) break;printf(“nnn“);return 0;2.sort_fun.cpp#include “myh.h“#include #include 程序设计挑战式课程设计报告- 12 -void Bubble(int a,int n)/冒泡排序int i,j,t;for(j=0;jai+1)t=ai;ai=ai+1;ai+1=t;/交换void Selection(int a,int n)/选择排序int i,j,k,t;for(i=0;i-1/向前搜索小于 aleft的数if(i=j)break;t=ai;ai=aj;aj=t;/交换
10、t=aleft;aleft=aj;aj=t;Quick(a,n,left,j-1);Quick(a,n,j+1,right);/左右半部分分别再次快速排序void Shift(int a , int i , int m)/建堆int k,t;t=ai;k=2*i+1;程序设计挑战式课程设计报告- 15 -while(k=0;i-) Shift(a,i,n);/初始化操作:将 an构造为初始堆for(i=n-1;i=1;i-)/每一趟排序的基本操作:将当前无序区的k=a0; /堆顶记录 a1和该区间的最后一个记录交换,a0=ai; /然后将新的无序区调整为堆(亦称重建堆)ai=k;Shift(a
11、,0,i);程序设计挑战式课程设计报告- 16 -void MergeSort(int R,int low,int high)/归并排序int mid;if(low m) m = *(p+i);return m;void sort2(int *p , int n , int loop)/将数字分配到各自的桶中,然后按照桶的顺序输出排序结果int buckets100100 ;/建立一组桶int tempNum = (int) pow(10 , loop-1);int i , j ;for( i = 0 ; i n ; i+ ) /求桶的 index 的除数int row_index = (*(
12、p+i) / tempNum) % 10;for(j = 0 ; j 20 ; j+) if(bucketsrow_indexj =NULL) 程序设计挑战式课程设计报告- 19 -bucketsrow_index j = *(p+i) ;break;int k = 0 ;/将桶中的数,倒回到原有数 组中for(i = 0 ; i 10 ; i+) for(j = 0 ; j 20 ; j+) if(bucketsij != NULL) *(p + k ) = bucketsij ;bucketsij=NULL;k+;3.myh.hvoid Bubble(int a,int n);void S
13、election(int a,int n);void Insertion(int a,int n);void Quick(int a,int n,int left,int right);程序设计挑战式课程设计报告- 20 -void Heap(int a , int n);void MergeSort(int R,int low,int high);void Bucket(int *p , int n);void Merge(int *R,int low,int m,int high);int getLoopTimes(int num);int findMaxNum( int *p , int n);void sort2(int *p , int n , int loop);