当前位置:   article > 正文

C语言实现数据结构:查找与排序_使用数据结构查找与排序知识设计并实现一个升级版的图书信息管理系统。要求定义一

使用数据结构查找与排序知识设计并实现一个升级版的图书信息管理系统。要求定义一

第四次上机实验报告

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/685567
推荐阅读
相关标签
  

闽ICP备14008679号