本科课程【数据结构与算法】实验7 - 快速排序、折半查找

x33g5p2x  于2022-03-31 转载在 其他  
字(3.4k)|赞(0)|评价(0)|浏览(394)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

  1. 实现快速排序算法
  2. 实现折半查找算法

二、 实验内容

1. 实验任务

(1)输入一个数组,将数组元素用快速排序输出
(2)输入一个目标数据,从已知链表中用折半查找查出目标数据的位置

2. 程序设计

1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
输入n个需要排序的数据(int 整型)

输入待查找的目标数据key(int 整型)

2) 数据存储(输入数据在内存中的存储)
n个数据都存储在数组Array[i]中

以链表的形式存储数据,采用动态分配内存并释放

3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
(1)
①先从数列中取出一个数为准基数
②分区过程,将比这个数大的数全部放在他的右边,小于或等于它的数全部放在左边
③再对左右区间重复第二步,直到各区间只有一个数

(2)
①将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;
②否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表;
③重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

4) 数据输出

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:VC++ 2013
  3. 实验设备:PC

源代码(C++实现)

快速排序

  1. #include<iostream>
  2. using namespace std;
  3. void QuickSort(int Array[], int left, int right);
  4. int main()
  5. {
  6. int array[] = { 3, 21, 87, 1, 21, 10 };
  7. cout << "排序前数列为:";
  8. for (int i = 0; i < 6; i++)
  9. {
  10. cout<< array[i]<<" ";
  11. }
  12. cout << endl;
  13. QuickSort(array, 0, 5);
  14. cout << "快速排序后为:";
  15. for (int i = 0; i < 6; i++)
  16. {
  17. cout << array[i]<<" ";
  18. }
  19. cout << endl;
  20. system("pause");
  21. return 0;
  22. }
  23. void QuickSort(int Array[], int left, int right)
  24. {
  25. if (left >= right)
  26. {
  27. return;
  28. }
  29. int first = Array[left];
  30. int leftIndex = left, rightIndex = right;
  31. while (leftIndex < rightIndex)
  32. {
  33. while (leftIndex < rightIndex)
  34. {
  35. if (first <= Array[rightIndex])
  36. {
  37. rightIndex--;
  38. }
  39. else
  40. {
  41. Array[leftIndex] = Array[rightIndex];
  42. leftIndex++;
  43. break;
  44. }
  45. }
  46. while (leftIndex < rightIndex)
  47. {
  48. if (first >= Array[leftIndex])
  49. {
  50. leftIndex++;
  51. }
  52. else
  53. {
  54. Array[rightIndex] = Array[leftIndex];
  55. rightIndex--;
  56. break;
  57. }
  58. }
  59. }
  60. Array[leftIndex] = first;
  61. QuickSort(Array, left, leftIndex - 1);
  62. QuickSort(Array, rightIndex + 1, right);
  63. }

折半查找

  1. #include<iostream>
  2. using namespace std;
  3. // 线性表中的元素
  4. typedef int KeyType;
  5. typedef struct ElemType {
  6. KeyType key; // 主关键字
  7. // 省略其他数据,不再定义
  8. }ElemType;
  9. // 线性表的顺序存储结构
  10. typedef struct SeqTable {
  11. ElemType* elem; // 数据元素存储空间基址,建表时按实际长度分配,
  12. // 0 号单元留空,从 1 号单元开始使用。
  13. int length; // 表长度
  14. }SeqTable;
  15. //
  16. // 在此处声明函数
  17. //
  18. int BinarySearch(SeqTable* pST, KeyType key);
  19. void InitSeqTable(SeqTable* pST);
  20. void DeleteSeqTable(SeqTable* pST);
  21. int main()
  22. {
  23. KeyType n,m;
  24. SeqTable ST; // 线性表
  25. //
  26. // 初始化线性表
  27. //
  28. InitSeqTable(&ST);
  29. cout << "初始线性表为:";
  30. for (int i = 1; i <= ST.length; i++)
  31. {
  32. cout << ST.elem[i].key << " ";
  33. }
  34. cout << endl;
  35. cout << "输入要查找的元素:";
  36. cin >> n;
  37. //
  38. // 折半查找
  39. //
  40. m=BinarySearch(&ST, n);
  41. cout << n << "位于链表的第" << m << "位" << endl;
  42. //
  43. // 销毁线性表
  44. //
  45. DeleteSeqTable(&ST);
  46. system("pause");
  47. return 0;
  48. }
  49. /*
  50. 功能:
  51. 折半查找。
  52. 参数:
  53. pST -- 线性表指针
  54. key -- 查找关键字
  55. 返回值:
  56. 如果查找成功返回关键字在表中的位置
  57. 如果查找失败返回 0
  58. */
  59. int BinarySearch(SeqTable* pST, KeyType key)
  60. {
  61. int low = 1;
  62. int high = pST->length;
  63. int mid;
  64. while (low < high)
  65. {
  66. mid = (low + high) / 2;
  67. if (pST->elem[mid].key == key)
  68. {
  69. return mid;
  70. break;
  71. }
  72. else if (pST->elem[mid].key>key)
  73. {
  74. high = mid - 1;
  75. }
  76. else
  77. {
  78. low = mid + 1;
  79. }
  80. }
  81. }
  82. /*
  83. 功能:
  84. 初始化线性表。
  85. 参数:
  86. pST -- 线性表指针
  87. */
  88. // 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12
  89. int InitArray[] = { 2, 4, 11, 18, 25, 32, 39, 46, 53, 60, 67, 74 }; // 顺序必须为从小到大
  90. void InitSeqTable(SeqTable* pST)
  91. {
  92. int i;
  93. pST->length = sizeof(InitArray) / sizeof(InitArray[0]);
  94. pST->elem = (ElemType*)malloc((pST->length + 1) * sizeof(ElemType)); // 因为单元 0 留空,所以长度必须加 1
  95. for (i = 1; i <= pST->length; i++)
  96. pST->elem[i].key = InitArray[i - 1];
  97. }
  98. /*
  99. 功能:
  100. 销毁线性表。
  101. 参数:
  102. pST -- 线性表指针
  103. */
  104. void DeleteSeqTable(SeqTable* pST)
  105. {
  106. free(pST->elem);
  107. pST->elem = NULL;
  108. pST->length = 0;
  109. }

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

相关文章