各种排序算法时间性能的比较.doc
word一、实训目的与要求 数据结构是计算机课程的一门重要的根底课,它的教学要求大致有三个重要方面:其一就是让学生学会分析研究计算机加工的数据对象的特性,以便为数据选择适当的物理结构和逻辑结构;其二,根据结构,选择适当的算法,并初步掌握算法的时间分析和空间分析;其三,学习复杂的程序设计。本综合实训利用Visual Studio 2008 集成编程环境为实践工具,通过上机实践培养学生分析具体问题、解决实际问题的能力,训练和培养学生的数据抽象能力和程序设计的能力。 数据结构是一门实践性较强的课程,以培养学生的数据抽象能力和程序设计的能力为目的。在实训时应注重培养学生的实际操作能力。本综合实训安排了18学时的实验课时,具体要求如下:1. 学习和理解每个实训题目的根本理论和方法;2. 掌握每个实验的实现步骤和关键技术;3. 准备好实验所需要的资源和文档;4. 上机实现程序,得到通过调试的正确程序。5. 根据每个实验的不同要求,完成实验报告的word文档。2、 实训环境 Windows XPVisual Studio 2013 三、实训容 (1) 设计并实现上述各种排序算法;(2) 产生正序和逆序的初始排列分别调用上述排序算法,并比拟时间性能;(3) 产生随机的初始排列分别调用上述排序算法,并比拟时间性能。 4对各种排序方法直接插入排序、希尔排序、起泡排序、直接选择排序的时间性能进展比拟。四、算法描述与实训步骤 上述各种排序方法都是基于比拟的排序,其时间主要消耗在排序过程中进展的记录的比拟次数和移动次数,因此,统计在一样数据状态下不同排序算法的比拟次数和移动次数,即可实现比拟各种排序算法的目的。五、总结与心得体会直接选择排序算法是对冒泡排序的改良,这种方法是在参加排序数组中找出最小或最大的数据元素,使它与第一个元素中的数据相互交换位置然后再在余下的元素中找出最小或最大的数据元素与第二个元素中的元素交换位置,以此类推直到所有元素成为有序序列。六、实训结果七、源代码:#include <stdio.h>#include <stdlib.h>#include <time.h>/正序希尔排序void xiEr(int num, int n, int &no, int &r)int item;int i, j, d;for (d = n / 2; d >= 1; d = d / 2)for (i = d; i<n; i+)item = numi;j = i - d;while (j >= 0) && (item<numj)numj + d = numj;j = j - d;r = r + 1;numj + d = item;no = no + 1;/printf("n");/for(int x=0;x<n;x+)/printf("%dt",numx);/逆序希尔排序void xiErUp(int num, int n, int &no, int &r)int item;int i, j, d;for (d = n / 2; d >= 1; d = d / 2)for (i = d; i<n; i+)item = numi;j = i - d;while (j >= 0) && (item>numj)numj + d = numj;j = j - d;r = r + 1;numj + d = item;no = no + 1;/正序冒泡排序void MaoPao(int num, int n, int &no, int &r)bool flag;int test;for (int i = 1; i<n; i+)flag = true;for (int j = n - 1; j >= i; j-)if (numj<numj - 1)test = numj;numj = numj - 1;numj - 1 = test;flag = false;r+;no+;if (flag)return;void MaoPaoUp(int num, int n, int &no, int &r)bool flag;int test;for (int i = 1; i<n; i+)flag = true;for (int j = n - 1; j >= i; j-)if (numj>numj - 1)test = numj;numj = numj - 1;numj - 1 = test;flag = false;r+;no+;if (flag)return;void ChaRu(int num, int n, int &no, int &r)/直接插入排序/ :比拟次数,r : 移动次数。int i, j, x;for (i = 1; i<n; i+)no+;x = numi;j = i - 1;while (j >= 0) && (x<numj)r+;numj + 1 = numj;j-; / 顺序比拟和移动numj + 1 = x;void ChaRuUp(int num, int n, int &no, int &r)/直接插入排序/:比拟次数,r : 移动次数。int i, j, x;for (i = 1; i<n; i+)no+;x = numi;j = i - 1;while (j >= 0) && (x>numj)r+;numj + 1 = numj;j-; / 顺序比拟和移动numj + 1 = x;void XuanZe(int num, int n, int &no, int &r)/直接选择排序/:比拟次数,r:移动次数int x; int i, j, k;for (i = 1; i <= n - 1; i+)k = i - 1;for (j = i; j <= n - 1; j+)no+; if (numj < numk) k = j;if (k != i - 1)r+;x = numi - 1;numi - 1 = numk;numk = x;void XuanZeUp(int num, int n, int &no, int &r)/直接选择排序/:比拟次数,r:移动次数int x; int i, j, k;for (i = 1; i <= n - 1; i+)k = i - 1;for (j = i; j <= n - 1; j+)no+; if (numj > numk) k = j;if (k != i - 1)r+;x = numi - 1;numi - 1 = numk;numk = x;void ShuChu(int num, int n, int no, int r, char name)printf("=输出%s排序后数据如下=nn", name);for (int x = 0; x<n; x+)printf("%dt", numx);printf("n比拟的次数为:%dt移动的次数为:%d", no, r);printf("n=nn");int main()int num100;int n = 100;int no1, no2, no3, no4;int r1, r2, r3, r4;int no11, no22, no33, no44;int r11, r22, r33, r44;char name1 = "希尔正序"char name11 = "希尔逆序"char name2 = "冒泡正序"char name22 = "冒泡逆序"char name3 = "直接插入正序"char name33 = "直接插入逆序"char name4 = "直接选择正序"char name44 = "直接选择逆序"int item1100;int item2100;int item3100;int item4100;int item22100;int item33100;int item44100;no4 = no3 = no2 = no1 = 0;r4 = r3 = r2 = r1 = 0;no44 = no33 = no22 = no11 = 0;r44 = r33 = r22 = r11 = 0;printf("=初始的随机数据如下=nn");for (int i = 0; i<n; i+)numi = rand() %100;printf("%dt", numi);for (int x = 0; x<n; x+)item1x = numx;item2x = numx;item3x = numx;item4x = numx;item22x = numx;item33x = numx;item44x = numx;xiEr(num, n, no1, r1);ShuChu(num, n, no1, r1, name1); xiEr(item1,n,no11,r11);ShuChu(item1,n,no11,r11,name11);MaoPao(item2,n, no2, r2);ShuChu(item2, n, no2, r2, name2);MaoPaoUp(item22, n, no22, r22);ShuChu(item22, n, no22, r22, name22);ChaRu(item3,n,no3,r3);ShuChu(item3, n, no3, r3, name3);ChaRuUp(item33, n, no33, r33);ShuChu(item33, n, no33, r33, name33);XuanZe(item4, n, no4, r4);ShuChu(item4, n, no4, r4, name4);XuanZeUp(item44, n, no44, r44);ShuChu(item44, n, no44, r44, name44);printf("=n");printf("=n");printf("所有排序的比拟次数和移动次数如下:nn");printf("%s:t比拟次数为:%d 移动次数为:%dn", name1, no1, r1);printf("%s:t比拟次数为:%d 移动次数为:%dn", name1, no11,r11);printf("%s:t比拟次数为:%d 移动次数为:%dn", name2, no2, r2);printf("%s:t比拟次数为:%d 移动次数为:%dn", name22, no22,r22);printf("%s:t比拟次数为:%d 移动次数为:%dn", name3, no3, r3);printf("%s:t比拟次数为:%d 移动次数为:%dn", name33, no33,r33);printf("%s:t比拟次数为:%d 移动次数为:%dn", name4, no4, r4);printf("%s:t比拟次数为:%d 移动次数为:%dn", name44, no44,r44);printf("n=n");getchar();return 0;13 / 11