各种排序算法时间性能的比较讲解

  • 格式:doc
  • 大小:261.55 KB
  • 文档页数:12

实训报告 实训题目:各种排序算法时间性能的比较

学 院: 计算机科学与技术学院 专 业: 软件工程 班 级: 142 学 号: 1400170269 学生姓名: 莫磊 指导教师: 蔡丽

2016年 3 月15 日 一、实训目的及要求 数据结构是计算机课程的一门重要的基础课,它的教学要求大致有三个重要方面:其一就是让学生学会分析研究计算机加工的数据对象的特性,以便为数据选择适当的物理结构和逻辑结构;其二,根据结构,选择适当的算法,并初步掌握算法的时间分析和空间分析;其三,学习复杂的程序设计。本综合实训利用Visual Studio 2008 集成编程环境为实践工具,通过上机实践培养学生分析具体问题、解决实际问题的能力,训练和培养学生的数据抽象能力和程序设计的能力。 数据结构是一门实践性较强的课程,以培养学生的数据抽象能力和程序设计的能力为目的。在实训时应注重培养学生的实际操作能力。本综合实训安排了18学时的实验课时,具体要求如下: 1. 学习和理解每个实训题目的基本理论和方法; 2. 掌握每个实验的实现步骤和关键技术; 3. 准备好实验所需要的资源和文档; 4. 上机实现程序,得到通过调试的正确程序。 5. 根据每个实验的不同要求,完成实验报告的word文档。

二、实训环境 Windows XP Visual Studio 2013

三、实训内容 (1) 设计并实现上述各种排序算法; (2) 产生正序和逆序的初始排列分别调用上述排序算法,并比较时间性能; (3) 产生随机的初始排列分别调用上述排序算法,并比较时间性能。 (4)对各种排序方法(直接插入排序、希尔排序、起泡排序、直接选择排序)的时间性能进行比较。

四、算法描述及实训步骤 上述各种排序方法都是基于比较的内排序,其时间主要消耗在排序过程中进行的记录的比较次数和移动次数,因此,统计在相同数据状态下不同排序算法的比较次数和移动次数,即可实现比较各种排序算法的目的。 五、总结及心得体会 直接选择排序算法是对冒泡排序的改进,这种方法是在参加排序数组中找出最小(或最大)的数据元素,使它与第一个元素中的数据相互交换位置然后再在余下的元素中找出最小(或最大)的数据元素与第二个元素中的元素交换位置,以此类推直到所有元素成为有序序列。 六、实训结果 七、源代码: #include #include #include

//正序希尔排序 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; iitem = num[i]; j = i - d; while ((j >= 0) && (itemnum[j + d] = num[j]; j = j - d; r = r + 1; } num[j + d] = item; no = no + 1; } } // printf("\n"); // for(int x=0;x// printf("%d\t",num[x]); // } }

//逆序希尔排序 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; iitem = num[i]; j = i - d; while ((j >= 0) && (item>num[j])){ num[j + d] = num[j]; j = j - d; r = r + 1; } num[j + d] = item; no = no + 1; } } }

//正序冒泡排序 void MaoPao(int num[], int n, int &no, int &r){ bool flag; int test; for (int i = 1; iflag = true; for (int j = n - 1; j >= i; j--){ if (num[j]test = num[j]; num[j] = num[j - 1]; num[j - 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; iflag = true; for (int j = n - 1; j >= i; j--){ if (num[j]>num[j - 1]){ test = num[j]; num[j] = num[j - 1]; num[j - 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{ no++; x = num[i]; j = i - 1; while ((j >= 0) && (x{ r++; num[j + 1] = num[j]; j--; } // 顺序比较和移动 num[j + 1] = x; } }

void ChaRuUp(int num[], int n, int &no, int &r)//直接插入排序 { //:比较次数,r : 移动次数。 int i, j, x; for (i = 1; i{ no++; x = num[i]; j = i - 1; while ((j >= 0) && (x>num[j])) { r++; num[j + 1] = num[j]; j--; } // 顺序比较和移动 num[j + 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 (num[j] < num[k]) k = j; } if (k != i - 1) { r++; x = num[i - 1]; num[i - 1] = num[k]; num[k] = 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 (num[j] > num[k]) k = j; } if (k != i - 1) { r++; x = num[i - 1]; num[i - 1] = num[k]; num[k] = x; } } }

void ShuChu(int num[], int n, int no, int r, char name[]){ printf("===============输出%s排序后数据如下==============\n\n", name); for (int x = 0; xprintf("%d\t", num[x]); } printf("\n比较的次数为:%d\t移动的次数为:%d", no, r); printf("\n===========================================================\n\n"); } int main(){ int num[100]; 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 item1[100]; int item2[100]; int item3[100]; int item4[100]; int item22[100]; int item33[100]; int item44[100]; no4 = no3 = no2 = no1 = 0; r4 = r3 = r2 = r1 = 0; no44 = no33 = no22 = no11 = 0; r44 = r33 = r22 = r11 = 0; printf("============初始的随机数据如下===========\n\n"); for (int i = 0; inum[i] = rand() %100; printf("%d\t", num[i]); }