当前位置:   article > 正文

C语言实现数据结构:查找与排序_设计并实现一个管理系统 (学生管理、图书管理、产品管理等等)系统中需包含1000条

设计并实现一个管理系统 (学生管理、图书管理、产品管理等等)系统中需包含1000条

第四次上机实验报告

1.作业题目

计并实现一个管理系统(学生管理、图书管理、产品管理等等),系统中需包含1000条以上的记录,系统至少包含以下功能:

(1) 自动生成记录信息(或者从文件中读取);

(2) 逐条显示所有记录信息;

(3) 利用时间复杂度O(n2)的排序算法(例如直接插入排序或者折半插入排序)按照关键字进行排序;

(4) 利用时间复杂度O(nlogn)的排序算法(例如快速排序)按照关键字进行排序;

(5) 程序中统计(3)和(4)的算法在数据正序、逆序、乱序情况下的比较次数与移动次数并输出,在报告中对比较次数与移动次数进行分析。

程序运行结果截图,需测试各种情况。写出测试过程中遇到的主要问题及所采用的解决措施。

2. 运行结果截图:

 

3.排序移动次数和比较次数分析

Ⅰ.直接插入排序

①.乱序:

移动次数:1517940

比较次数:751710

②.逆序

移动次数:1498500

比较次数:499500

③.正序

移动次数:0

比较次数:0

Ⅱ.冒泡排序

①.乱序:

移动次数:758970

比较次数:498720

②.逆序

移动次数:1498500

比较次数:499500

③.正序

移动次数:0

比较次数:999

Ⅲ.快速排序

①.乱序:

移动次数:4862

比较次数:10487

②.逆序

移动次数:1998

比较次数:49500

③.正序

移动次数:1998

比较次数:49500

4.得出的结论:

直接插入排序:

正序移动次数为0,比较次数为0;

逆序移动次数为3*0.5*n*(n-1),比较次数为0.5*n*(n-1);

乱序介于它们之间。

冒泡排序:

正序移动次数为0,比较次数为n-1;

逆序移动次数为3*0.5*n*(n-1),比较次数为0.5*n*(n-1);

乱序介于它们之间。

快速排序:

正序移动次数为2*(n-1),比较次数为0.5*n*(n-1);

逆序移动次数为2*(n-1),比较次数为0.5*n*(n-1);

乱序均比它们大。

5.附录

列出程序文件清单,及文件功能。

头文件:

sort.h:存放宏定义、全局变量定义和函数声明

源文件:

main.cpp:存放主函数

sort.cpp:存放其他分函数

代码注释要求:

  1. 对关键的算法实现代码有必要的注释
  2. 函数说明格式:

*****************************************************

函数名:

函数功能:

输入参数:

       类型,参数名,含义

输出参数:

       返回值,含义

文件提交要求:

将两道题目各自的完整工程(包含该工程下所有目录和文件)和此文档一起打包,以组内学生姓名作为文件名,上传提交。例如Stu1_Stu2.zip

代码:

sort.h

  1. #pragma once
  2. #define ARRAY_LEN 1000 // 数组长度
  3. #define MIN 1 // 数组的最小值
  4. #define MAX 1000 // 数组的最大值
  5. int Comparisons_num; // 比较次数
  6. int Mobile_num; // 移动次数
  7. void Create_data(double* a, int n, int min, int max); // 建立伪随机分数
  8. void Copy_array(double* tar, double* arr, int len); // 复制数组
  9. void Swap_element(double* a, double* b); // 交换元素
  10. void Insert_sort(double* arr, int len); // 直接插入排序
  11. void Bubble_sort(double* arr, int len); // 冒泡排序
  12. int Division(double* a, int left, int right); // 分隔过程(快速排序)
  13. void Quick_sort(double* arr, int left, int right, int count); // 快速排序(left和count初始值为0,right初始值为数组长度 - 1)
  14. void Print_sort_negative(double* arr, int len); // 逆序输出
  15. void Print_sort_positive(double* arr, int len); // 输出
  16. void Print_mob_com(); // 显示移动次数和比较次数

sort.cpp

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5. #include <conio.h>
  6. #include <string.h>
  7. extern int Comparisons_num; // 比较次数
  8. extern int Mobile_num; // 移动次数
  9. //  建立伪随机数组
  10. void Create_data(double* a, int n, int min, int max)
  11. {
  12. int flag; //  避免取重复取值
  13. srand(time(NULL));
  14. if (n > max - min + 1)
  15. ;
  16. for (int i = 0, j = 0; i < n; i++)
  17. {
  18. do
  19. {
  20. a[i] = (max - min + 1) * rand() / (RAND_MAX + 1) + 1;
  21. flag = 0;
  22. for (j = 0; j < i; j++)
  23. {
  24. if (a[i] == a[j])
  25. flag = 1;
  26. }
  27. } while (flag);
  28. }
  29. }
  30. //  复制数组
  31. void Copy_array(double* tar, double* arr, int len)
  32. {
  33. int i;
  34. for (i = 0; i < len; i++)
  35. tar[i] = arr[i];
  36. }
  37. //  交换元素
  38. void Swap_element(double* a, double* b)
  39. {
  40. double tmp = *a;
  41. *a = *b;
  42. *b = tmp;
  43. Mobile_num += 3; //  一次关键字交换计为3次移动
  44. }
  45. // 直接插入排序
  46. void Insert_sort(double* arr, int len)
  47. {
  48. int i, j;
  49. int tmp; // 待排序的元素
  50. for (i = 0; i < len; i++)
  51. {
  52. tmp = arr[i];
  53. for (j = i - 1; j >= 0 && tmp < arr[j]; j--)
  54. {
  55. Swap_element(arr + j, arr + j + 1);
  56. Comparisons_num++;
  57. }
  58. arr[j + 1] = tmp;
  59. }
  60. }
  61. // 冒泡排序
  62. void Bubble_sort(double* arr, int len)
  63. {
  64. int i, j;
  65. int flag = 1; // 标记循环过程是否进行过交换,如果为1则进行了交换
  66. for (i = 0; i < len && flag; i++)
  67. {
  68. flag = 0;
  69. for (j = 1; j < len - i; j++)
  70. {
  71. if (arr[j - 1] > arr[j])
  72. {
  73. Swap_element(arr + j, arr + j - 1);
  74. flag = 1;
  75. }
  76. Comparisons_num++;
  77. }
  78. }
  79. }
  80. //  分隔(快速排序)
  81. int Division(double* a, int left, int right)
  82. {
  83. double base = a[left];
  84. while (left < right)
  85. {
  86. while (left < right && base < a[right])
  87. {
  88. right--;
  89. Comparisons_num++;
  90. }
  91. a[left] = a[right];
  92. Mobile_num++;
  93. while (left < right && a[left] < base)
  94. {
  95. left++;
  96. Comparisons_num++;
  97. }
  98. a[right] = a[left];
  99. Mobile_num++;
  100. }
  101. a[left] = base;
  102. return left;
  103. }
  104. //  快速排序
  105. //  left 和 count初始值为0 right 初始值为数组长度 - 1
  106. void Quick_sort(double* arr, int left, int right, int count)
  107. {
  108. int i;
  109. int count_temp = count + 1;
  110. if (left < right)
  111. {
  112. i = Division(arr, left, right);
  113. Quick_sort(arr, left, i - 1, count_temp);
  114. Quick_sort(arr, i + 1, right, count_temp);
  115. }
  116. }
  117. // 输出
  118. void Print_sort_positive(double* arr, int len)
  119. {
  120. int i;
  121. for (i = 0; i < len; i++)
  122. {
  123. printf("%5.1f ", arr[i]/10);
  124. }
  125. putchar('\n');
  126. }
  127. // 逆序输出
  128. void Print_sort_negative(double* arr, int len)
  129. {
  130. int i;
  131. for (i = 0; i < len; i++)
  132. {
  133. printf("%5.1f ", arr[len - i - 1]/10);
  134. }
  135. putchar('\n');
  136. }
  137. // 显示移动次数和比较次数
  138. void Print_mob_com()
  139. {
  140. printf("移动次数:%d\n", Mobile_num);
  141. printf("比较次数:%d\n\n", Comparisons_num);
  142. // 初始化
  143. Mobile_num = Comparisons_num = 0;
  144. }

main.cpp

  1. #include "Sort.h"
  2. #include <stdio.h>
  3. int main(void)
  4. {
  5. double arr[ARRAY_LEN];
  6. double rightarr[ARRAY_LEN];
  7. double leftarr[ARRAY_LEN];
  8. double target_arr[ARRAY_LEN];
  9. double target_rightarr[ARRAY_LEN];
  10. double target_leftarr[ARRAY_LEN];
  11. Create_data(arr, ARRAY_LEN, MIN, MAX);
  12. Copy_array(target_arr, arr, ARRAY_LEN);
  13. Bubble_sort(target_arr, ARRAY_LEN);
  14. Copy_array(rightarr, target_arr, ARRAY_LEN);
  15. for (int i = 0; i < ARRAY_LEN; i++) {
  16. leftarr[i] = rightarr[ARRAY_LEN-i-1];
  17. }
  18. printf("以下为随机生成的1000个学生的分数数据: \n(分数从0.1到100.0分各不相同)\n");
  19. Print_sort_positive(arr, ARRAY_LEN);
  20. printf("\n*****************************************************************************\n");
  21. printf("\n直接插入排序: \n");
  22. printf("\n乱序: \n");
  23. Copy_array(target_arr, arr, ARRAY_LEN);
  24. Print_sort_positive(target_arr, ARRAY_LEN);
  25. Insert_sort(target_arr, ARRAY_LEN);
  26. printf("直接插入排序:\n");
  27. Print_mob_com();
  28. printf("\n逆序: \n");
  29. Copy_array(target_leftarr, leftarr, ARRAY_LEN);
  30. Print_sort_positive(target_leftarr, ARRAY_LEN);
  31. Insert_sort(target_leftarr, ARRAY_LEN);
  32. printf("直接插入排序:\n");
  33. Print_mob_com();
  34. printf("\n正序: \n");
  35. Copy_array(target_rightarr, rightarr, ARRAY_LEN);
  36. Print_sort_positive(target_rightarr, ARRAY_LEN);
  37. Insert_sort(target_rightarr, ARRAY_LEN);
  38. printf("直接插入排序:\n");
  39. Print_mob_com();
  40. printf("\n*****************************************************************************\n");
  41. printf("\n冒泡排序: \n");
  42. printf("\n乱序: \n");
  43. Copy_array(target_arr, arr, ARRAY_LEN);
  44. Print_sort_positive(target_arr, ARRAY_LEN);
  45. Bubble_sort(target_arr, ARRAY_LEN);
  46. printf("冒泡排序:\n");
  47. Print_mob_com();
  48. printf("\n逆序: \n");
  49. Copy_array(target_leftarr, leftarr, ARRAY_LEN);
  50. Print_sort_positive(target_leftarr, ARRAY_LEN);
  51. Bubble_sort(target_leftarr, ARRAY_LEN);
  52. printf("冒泡排序:\n");
  53. Print_mob_com();
  54. printf("\n正序: \n");
  55. Copy_array(target_rightarr, rightarr, ARRAY_LEN);
  56. Print_sort_positive(target_rightarr, ARRAY_LEN);
  57. Bubble_sort(target_rightarr, ARRAY_LEN);
  58. printf("冒泡排序:\n");
  59. Print_mob_com();
  60. printf("\n*****************************************************************************\n");
  61. printf("\n快速排序: \n");
  62. printf("\n乱序: \n");
  63. Copy_array(target_arr, arr, ARRAY_LEN);
  64. Print_sort_positive(target_arr, ARRAY_LEN);
  65. Quick_sort(target_arr, 0, ARRAY_LEN - 1, 0);
  66. printf("快速排序:\n");
  67. Print_mob_com();
  68. printf("\n逆序: \n");
  69. Copy_array(target_leftarr, leftarr, ARRAY_LEN);
  70. Print_sort_positive(target_leftarr, ARRAY_LEN);
  71. Quick_sort(target_leftarr, 0, ARRAY_LEN - 1, 0);
  72. printf("快速排序:\n");
  73. Print_mob_com();
  74. printf("\n正序: \n");
  75. Copy_array(target_rightarr, rightarr, ARRAY_LEN);
  76. Print_sort_positive(target_rightarr, ARRAY_LEN);
  77. Quick_sort(target_rightarr, 0, ARRAY_LEN - 1, 0);
  78. printf("快速排序:\n");
  79. Print_mob_com();
  80. return 0;
  81. }

查找算法与排序算法总结:

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/807591
推荐阅读
相关标签
  

闽ICP备14008679号