归并排序的设计与实现
《数据结构》实验指导书

1.单链表的类型定义
#include <stdio.h>
typedef int ElemType;//单链表结点类型
typedef struct LNode
{ElemType data;
struct LNode *next;
2.明确栈、队列均是特殊的线性表。
3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。
六、实验报告
根据实验情况和结果撰写并递交实验报告。
实验四 串
一、预备知识
1.字符串的基本概念
2.字符串的模式匹配算法
二、实验目的
1.理解字符串的模式匹配算法(包括KMP算法)
typedef struct
{ElemType *base;
int front,rear;
} SqQueue;
4.单链队列的类型定义
typedef struct QNode
{QElemType data;
typedef struct list
{ElemType elem[MAXSIZE];//静态线性表
int length; //顺序表的实际长度
} SqList;//顺序表的类型名
五、注意问题
1.插入、删除时元素的移动原因、方向及先后顺序。
4.三元组表是线性表的一种应用,通过它可以更好地理解线性表的存储结构。同时矩阵又是图的重要的存储方式,所以这个实验对更好地掌握线性表对将来对图的理解都有极大的帮助。
六、实验报告
根据实验情况和结果撰写并递交实验报告。
实验六 树和二叉树
一、预备知识
1.二叉树的二叉链表存储结构
《归并排序》教学设计

《归并排序》教学设计归并排序教学设计介绍归并排序归并排序是一种高效的排序算法,它基于分治的思想。
它将待排序的序列不断地分割成较小的子序列,直到每个子序列只有一个元素,然后将这些子序列两两合并,使得合并后的序列有序。
归并排序的时间复杂度为O(nlogn),所以在处理大规模数据排序时非常有效。
教学目标通过本教学设计,学生将能够:1. 理解归并排序的原理和过程;2. 掌握归并排序的实现方法;3. 熟练应用归并排序解决实际问题;4. 分析和评估归并排序的时间复杂度和空间复杂度。
教学内容理论讲解1. 归并排序的基本思想和过程;2. 归并排序的时间复杂度和空间复杂度分析;3. 归并排序的应用场景和优缺点。
算法实现1. 递归实现归并排序;2. 非递归实现归并排序。
实例分析通过一些实际例子,演示如何使用归并排序算法解决实际问题,例如对整数数组进行排序、对学生成绩进行排名等。
思考题和练为了加深学生对归并排序的理解和应用能力,设计一些思考题和练题,例如给定一组数据让学生手动执行归并排序算法、设计一些需要应用归并排序的问题等。
教学方法1. 理论讲解与实例分析相结合,既让学生理解归并排序的原理,又让他们看到归并排序在实际问题中的应用;2. 引导学生通过自主实践,编写归并排序的代码,并测试其正确性和效果。
评估方法1. 设计一份归并排序的小测试,包括选择题和编程题,以评估学生对归并排序的掌握程度;2. 观察学生在实践中的表现,评估其在应用归并排序解决实际问题时的能力。
参考资料- 归并排序的原理与实现方法- 《算法导论》本教学设计旨在通过理论讲解、实例分析和实践操作,帮助学生全面了解归并排序算法,掌握其实现方法,并能够应用归并排序解决实际问题。
请根据实际情况进行适当调整和补充。
各种排序算法的课程设计

各种排序算法的课程设计一、课程目标知识目标:1. 让学生掌握排序算法的基本概念,了解不同排序算法的优缺点及应用场景。
2. 使学生能够理解和掌握冒泡排序、选择排序、插入排序等基本排序算法的原理和实现方法。
3. 帮助学生理解排序算法的时间复杂度和空间复杂度,并能够分析不同算法的效率。
技能目标:1. 培养学生运用编程语言实现排序算法的能力,提高编程实践操作技能。
2. 培养学生通过分析问题,选择合适的排序算法解决实际问题的能力。
情感态度价值观目标:1. 激发学生对计算机科学和算法的兴趣,培养主动探究和自主学习的精神。
2. 培养学生面对问题时的耐心和细心,提高解决问题的信心和团队合作意识。
3. 使学生认识到排序算法在生活中的广泛应用,体会算法对人类社会的贡献。
课程性质分析:本课程为计算机科学相关学科,旨在让学生掌握排序算法的基本原理和实现方法,提高编程实践能力。
学生特点分析:学生处于年级中段,具有一定的编程基础和逻辑思维能力,对新鲜事物充满好奇心,但学习耐心和自律性有待提高。
教学要求:1. 注重理论与实践相结合,提高学生的实际操作能力。
2. 通过案例分析,引导学生主动思考,提高问题解决能力。
3. 创设互动、轻松的学习氛围,关注学生个体差异,激发学习兴趣。
二、教学内容1. 排序算法基本概念:介绍排序的定义、排序算法的稳定性、内排序与外排序的分类。
2. 冒泡排序:讲解冒泡排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
3. 选择排序:介绍选择排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
4. 插入排序:讲解插入排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
5. 排序算法比较:对比冒泡排序、选择排序和插入排序的优缺点,探讨在不同场景下如何选择合适的排序算法。
6. 教学案例:结合实际案例,让学生动手实践排序算法,提高编程能力。
7. 排序算法拓展:简要介绍其他常用排序算法(如快速排序、归并排序等)的原理和应用。
常见算法设计实验报告(3篇)

第1篇一、实验目的通过本次实验,掌握常见算法的设计原理、实现方法以及性能分析。
通过实际编程,加深对算法的理解,提高编程能力,并学会运用算法解决实际问题。
二、实验内容本次实验选择了以下常见算法进行设计和实现:1. 排序算法:冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序。
2. 查找算法:顺序查找、二分查找。
3. 图算法:深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)。
4. 动态规划算法:0-1背包问题。
三、实验原理1. 排序算法:排序算法的主要目的是将一组数据按照一定的顺序排列。
常见的排序算法包括冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。
2. 查找算法:查找算法用于在数据集中查找特定的元素。
常见的查找算法包括顺序查找和二分查找。
3. 图算法:图算法用于处理图结构的数据。
常见的图算法包括深度优先搜索(DFS)、广度优先搜索(BFS)、最小生成树(Prim算法、Kruskal算法)等。
4. 动态规划算法:动态规划算法是一种将复杂问题分解为子问题,通过求解子问题来求解原问题的算法。
常见的动态规划算法包括0-1背包问题。
四、实验过程1. 排序算法(1)冒泡排序:通过比较相邻元素,如果顺序错误则交换,重复此过程,直到没有需要交换的元素。
(2)选择排序:每次从剩余元素中选取最小(或最大)的元素,放到已排序序列的末尾。
(3)插入排序:将未排序的数据插入到已排序序列中适当的位置。
(4)快速排序:选择一个枢纽元素,将序列分为两部分,使左侧不大于枢纽,右侧不小于枢纽,然后递归地对两部分进行快速排序。
(5)归并排序:将序列分为两半,分别对两半进行归并排序,然后将排序好的两半合并。
(6)堆排序:将序列构建成最大堆,然后重复取出堆顶元素,并调整剩余元素,使剩余元素仍满足最大堆的性质。
2. 查找算法(1)顺序查找:从序列的第一个元素开始,依次比较,直到找到目标元素或遍历完整个序列。
算法开发实训报告

一、实训背景随着计算机科学和信息技术的发展,算法作为计算机程序的核心,其重要性日益凸显。
为了提高学生的算法设计、实现和分析能力,我们开展了算法开发实训课程。
本次实训旨在让学生通过实际项目开发,深入了解算法原理,提高算法应用能力。
二、实训目标1. 熟悉常用算法的基本原理和实现方法;2. 能够根据实际问题选择合适的算法;3. 掌握算法分析、调试和优化方法;4. 培养团队协作和沟通能力。
三、实训内容1. 实训项目:基于单链表的排序算法实现项目描述:设计一个单链表,并实现插入排序、归并排序和快速排序三种排序算法,对链表中的元素进行排序。
2. 实训步骤(1)设计单链表节点结构体,包含数据域和指针域;(2)实现单链表的创建、插入、删除和遍历等基本操作;(3)实现插入排序、归并排序和快速排序三种排序算法;(4)测试排序算法的性能,对比分析不同排序算法的优缺点;(5)编写测试用例,验证排序算法的正确性。
四、实训过程1. 单链表节点结构体设计```ctypedef struct Node {int data;struct Node next;} Node;```2. 单链表基本操作实现```c// 创建单链表Node createList() {Node head = (Node)malloc(sizeof(Node));if (head == NULL) {return NULL;}head->next = NULL;return head;}// 插入节点void insertNode(Node head, int data) {Node newNode = (Node)malloc(sizeof(Node)); if (newNode == NULL) {return;}newNode->data = data;newNode->next = head->next;head->next = newNode;// 删除节点void deleteNode(Node head, int data) {Node temp = head;Node prev = NULL;while (temp != NULL && temp->data != data) { prev = temp;temp = temp->next;}if (temp == NULL) {return;}prev->next = temp->next;free(temp);}// 遍历链表void traverseList(Node head) {Node temp = head->next;while (temp != NULL) {printf("%d ", temp->data);temp = temp->next;}printf("\n");```3. 排序算法实现(1)插入排序```cvoid insertionSort(Node head) {Node sorted = NULL;Node current = head->next;Node prev = NULL;Node temp = NULL;while (current != NULL) {temp = current->next;current->next = NULL;if (sorted == NULL || sorted->data >= current->data) {current->next = sorted;sorted = current;} else {prev = sorted;while (prev->next != NULL && prev->next->data < current->data) {prev = prev->next;}current->next = prev->next;prev->next = current;}current = temp;}head->next = sorted;}```(2)归并排序```cNode merge(Node left, Node right) {Node result = NULL;if (left == NULL)return right;else if (right == NULL)return left;if (left->data <= right->data) {result = left;result->next = merge(left->next, right); } else {result = right;result->next = merge(left, right->next); }return result;}void mergeSort(Node head) {if (head == NULL || head->next == NULL)return;Node slow = head;Node fast = head;Node temp = NULL;while (fast != NULL && fast->next != NULL) { temp = slow;slow = slow->next;fast = fast->next->next;}temp->next = NULL;Node left = mergeSort(head);Node right = mergeSort(slow);head = merge(left, right);}```(3)快速排序```cint partition(Node head, int low, int high) {int pivot = head->next->data;Node i = head;Node j = head->next->next;while (j != NULL) {if (j->data < pivot) {i = i->next;int t = i->data;i->data = j->data;j->data = t;}j = j->next;}int t = i->data;i->data = head->next->data;head->next->data = t;return i->data;}void quickSort(Node head, int low, int high) { if (low < high) {int pi = partition(head, low, high); quickSort(head, low, pi - 1);quickSort(head, pi + 1, high);}}```4. 测试与优化通过编写测试用例,验证排序算法的正确性。
数据结构实验指导书(新版)

《数据结构与算法》实验指导书实验及学时数分配几点要求:一、上机前:认真预习相关实验内容,提前编写算法程序,上机时检查(未提前编写程序者,扣除平时成绩中实验相关分数)。
二、上机中:在Turbo C或VC6.0环境中,认真调试程序,记录调试过程中的问题、解决方法以及运行结果。
上机时签到;下机时验收签字。
三、下机后:按要求完成实验报告,并及时提交(实验后1周内)。
实验一线性表【实验目的】1、掌握用Turbo c上机调试线性表的基本方法;2、掌握线性表的基本操作,插入、删除、查找以及线性表合并等运算在顺序存储结构和链式存储结构上的运算;3、运用线性表解决线性结构问题。
【实验学时】4 学时【实验类型】设计型【实验内容】1、顺序表的插入、删除操作的实现;2、单链表的插入、删除操作的实现;3、两个线性表合并算法的实现。
(选做)【实验原理】1、当我们在线性表的顺序存储结构上的第i个位置上插入一个元素时,必须先将线性表中第i个元素之后的所有元素依次后移一个位置,以便腾出一个位置,再把新元素插入到该位置。
若是欲删除第i个元素时,也必须把第i个元素之后的所有元素前移一个位置;2、当我们在线性表的链式存储结构上的第i个位置上插入一个元素时,只需先确定第i个元素前一个元素位置,然后修改相应指针将新元素插入即可。
若是欲删除第i个元素时,也必须先确定第i个元素前一个元素位置,然后修改相应指针将该元素删除即可;3、详细原理请参考教材。
【实验步骤】一、用C语言编程实现建立一个顺序表,并在此表中插入一个元素和删除一个元素。
1、通过键盘读取元素建立线性表;(从键盘接受元素个数n以及n个整形数;按一定格式显示所建立的线性表)2、指定一个元素,在此元素之前插入一个新元素;(从键盘接受插入位置i,和要插入的元素值;实现插入;显示插入后的线性表)3、指定一个元素,删除此元素。
(从键盘接受删除元素位置i,实现删除;显示删除后的线性表)二、用C语言编程实现建立一个单链表,并在此表中插入一个元素和删除一个元素。
算法分析与设计习题答案

算法分析与设计习题答案《算法分析与设计》期末复习题及答案⼀、简要回答下列问题:1.算法重要特性是什么?2.算法分析的⽬的是什么?3.算法的时间复杂性与问题的什么因素相关?4.算法的渐进时间复杂性的含义?5.最坏情况下的时间复杂性和平均时间复杂性有什么不同?6.简述⼆分检索(折半查找)算法的基本过程。
7.背包问题的⽬标函数和贪⼼算法最优化量度相同吗?8.采⽤回溯法求解的问题,其解如何表⽰?有什么规定?9.回溯法的搜索特点是什么?10.n皇后问题回溯算法的判别函数place的基本流程是什么?11.为什么⽤分治法设计的算法⼀般有递归调⽤?12.为什么要分析最坏情况下的算法时间复杂性?13.简述渐进时间复杂性上界的定义。
14.⼆分检索算法最多的⽐较次数?15.快速排序算法最坏情况下需要多少次⽐较运算?16.贪⼼算法的基本思想?17.回溯法的解(x1,x2,……x n)的隐约束⼀般指什么?18.阐述归并排序的分治思路。
19.快速排序的基本思想是什么。
20.什么是直接递归和间接递归?消除递归⼀般要⽤到什么数据结构?21.什么是哈密顿环问题?22.⽤回溯法求解哈密顿环,如何定义判定函数?23.请写出prim算法的基本思想。
参考答案:1. 确定性、可实现性、输⼊、输出、有穷性2. 分析算法占⽤计算机资源的情况,对算法做出⽐较和评价,设计出额更好的算法。
3. 算法的时间复杂性与问题的规模相关,是问题⼤⼩n的函数。
4.当问题的规模n趋向⽆穷⼤时,影响算法效率的重要因素是T(n)的数量级,⽽其他因素仅是使时间复杂度相差常数倍,因此可以⽤T(n)的数量级(阶)评价算法。
时间复杂度T(n)的数量级(阶)称为渐进时间复杂性。
5. 最坏情况下的时间复杂性和平均时间复杂性考察的是n固定时,不同输⼊实例下的算法所耗时间。
最坏情况下的时间复杂性取的输⼊实例中最⼤的时间复杂度:W(n) = max{ T(n,I) } , I∈Dn平均时间复杂性是所有输⼊实例的处理时间与各⾃概率的乘积和:A(n) =∑P(I)T(n,I) I∈Dn6. 设输⼊是⼀个按⾮降次序排列的元素表A[i:j] 和x,选取A[(i+j)/2]与x⽐较,如果A[(i+j)/2]=x,则返回(i+j)/2,如果A[(i+j)/2]回溯法的搜索特点是什么7. 不相同。
关于算法的实验报告(3篇)

第1篇一、实验目的1. 理解快速排序算法的基本原理和实现方法。
2. 掌握快速排序算法的时间复杂度和空间复杂度分析。
3. 通过实验验证快速排序算法的效率。
4. 提高编程能力和算法设计能力。
二、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019三、实验原理快速排序算法是一种分而治之的排序算法,其基本思想是:选取一个基准元素,将待排序序列分为两个子序列,其中一个子序列的所有元素均小于基准元素,另一个子序列的所有元素均大于基准元素,然后递归地对这两个子序列进行快速排序。
快速排序算法的时间复杂度主要取决于基准元素的选取和划分过程。
在平均情况下,快速排序的时间复杂度为O(nlogn),但在最坏情况下,时间复杂度会退化到O(n^2)。
四、实验内容1. 快速排序算法的代码实现2. 快速排序算法的时间复杂度分析3. 快速排序算法的效率验证五、实验步骤1. 设计快速排序算法的C++代码实现,包括以下功能:- 选取基准元素- 划分序列- 递归排序2. 编写主函数,用于生成随机数组和测试快速排序算法。
3. 分析快速排序算法的时间复杂度。
4. 对不同规模的数据集进行测试,验证快速排序算法的效率。
六、实验结果与分析1. 快速排序算法的代码实现```cppinclude <iostream>include <vector>include <cstdlib>include <ctime>using namespace std;// 生成随机数组void generateRandomArray(vector<int>& arr, int n) {srand((unsigned)time(0));for (int i = 0; i < n; ++i) {arr.push_back(rand() % 1000);}}// 快速排序void quickSort(vector<int>& arr, int left, int right) { if (left >= right) {return;}int i = left;int j = right;int pivot = arr[(left + right) / 2]; // 选取中间元素作为基准 while (i <= j) {while (arr[i] < pivot) {i++;}while (arr[j] > pivot) {j--;}if (i <= j) {swap(arr[i], arr[j]);i++;j--;}}quickSort(arr, left, j);quickSort(arr, i, right);}int main() {int n = 10000; // 测试数据规模vector<int> arr;generateRandomArray(arr, n);clock_t start = clock();quickSort(arr, 0, n - 1);clock_t end = clock();cout << "排序用时:" << double(end - start) / CLOCKS_PER_SEC << "秒" << endl;return 0;}```2. 快速排序算法的时间复杂度分析根据实验结果,快速排序算法在平均情况下的时间复杂度为O(nlogn),在最坏情况下的时间复杂度为O(n^2)。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目: 归并排序的设计与实现初始条件:理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)输入一组数,用递归和非递归程序实现归并排序;(2)分析归并排序的复杂度;(3)将归并排序的思想用于外部排序中。
2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字;(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等;(4)结束语;(5)参考文献。
时间安排:2007年7月2日-7日(第18周)7月2日查阅资料7月3日系统设计,数据结构设计,算法设计7月4日-5日编程并上机调试7月6日撰写报告7月7日验收程序,提交设计报告书。
指导教师签名: 2007年7月2日系主任(或责任教师)签名: 2007年7月2日归并排序的设计和实现摘要:该程序主要由五个部分组成:把一组待排的数据信息放在结构体里,2-路归并排序,对数组作一趟归并排序,对数组作归并排序,主函数。
关键字:模型化, 2-路归并, 一趟归并, 归并0.引言归并排序是一种稳定的内部排序,“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。
无论是顺序存储结构还是链表存储结构,都可在O(m+n)的时间量级上实现。
利用归并的思想容易实现排序。
2—路归并排序:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到不小于n/2整数个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止。
1.需求分析(1)通过建立一个结构体,用来存放数据信息,包括数据的个数,本身记录。
(2)2-路归并排序的算法,实现两两归并。
(3)主函数初始化数据,及打印数据结果。
2.数据结构设计用结构体存储待排的数据。
#include "stdio.h"#include<stdio.h>#define MAXNUM 100#define TRUE 1#define FALSE 0typedef int DataType;typedef struct{int n; /* n为文件中的记录个数,n<MAXNUM */int record[MAXNUM];} SortObject;3.算法设计3.1 2-路归并排序的非递归算法//将有序的SR[i..m]和SR[m+1..n]归并为有序的TR[i..n]void merge(RcdType SR[],RcdType&TR[],int i,int m,int n){for(j=m+1,k=I;i<=m&&j<=n;k++){ //将SR中记录由小到大的并入TRif(LQ(SR[i].key,SR[j].key)) TR[k]=SR[i++];else TR[k]=SR[j++];}if(i<=m) TR[k..n]=SR[i..m]; //将剩余的SR[i..m]复制到TRif(j<=n) TR[k..n]=SR[j..n]; //将剩余的SR[i..m]复制到TR}//merge3.2 2-路归并排序的递归形式void Msort(RcdType SR[],RcdType&TR1[],int s,int t){ //将SR归并排序为TRif(s==t) TR1[s]=SR[s];else{m=(s+t)/2; //将平分为SR[s..t]和SR[m+1..t]Msort(SR,TR2,s,m); // 递归的将SR[s..m]归并为有序的TR2[s..m] Msort(SR,TR2,m+1,t); //递归地将SR[m+1..t]归并为有序的TR{m+1..t} Merge(TR2,TR1,s,m,t); // 将TR2[s..m]和TR2[m+1..t]归并到TR1[s..t] }}//mergesort3.3 对顺序表L作归并排序Void mergesort(SqList &L){Msort(L.r,L.r,1,L.length);}//mergesort3.4 非递归形式归并算法void merge(int r[], int r1[], int low, int m, int high){/* r[low]到r[m]和r[m+1]到r[right]是两个有序段 */int i = low, j = m + 1, k = low;while ( i <= m && j <= high ){ /* 反复复制两个段的第一个记录中较小的 */if (r[i] <= r[j] )r1[k++] = r[i++];else r1[k++] = r[j++];}while (i <= m) r1[k++] = r[i++]; /* 复制第一个段的剩余记录 */while (j <= high) r1[k++] = r[j++];/* 复制第二个段的剩余记录 */}3.5 对 r 做一趟归并的算法void mergePass(int r[], int r1[], int n, int length) {int i = 0, j; /* length为本趟归并的有序子段的长度 */while(i + 2*length - 1 < n){ /* 归并长length的两个子段*/merge(r, r1, i, i+length-1, i + 2*length - 1);i += 2*length;}if(i + length - 1 < n - 1) /* 剩下两段,后一段长度小于 length */ merge(r, r1, i, i+length-1, n-1);else /* 将剩下的一段复制到数组r1 */for(j = i; j < n; j++) r1[j] = r[j];}3.6 对整个数据进行归并的算法void mergeSort(SortObject * p ){int record[MAXNUM];int length = 1;int i;while (length < p->n){/* 一趟归并,结果存放在数组record中*/mergePass(p->record, record, p->n, length);length *= 2;/* 一趟归并,结果存回 */mergePass(record, p->record, p->n, length);length *= 2;}}4. 程序实现4.1 主程序main(){int i;SortObject vector = {8, 49,38,65,97,76,13,27,49};clrscr(); /*请屏函数*/printf("The raw numbers is:\n"); /*归并前的数据*/for(i = 0; i < 8; i++)printf("%d ", vector.record[i]);mergeSort(&vector);printf("\n");printf("The sorted numbers is:\n");/*归并后的数据*/for(i = 0; i < 8; i++)printf("%d ", vector.record[i]);getchar();}4.2 程序运行结果在设计此程序的时候,我试图让用户自己输入要排序的数据,但是发现最后的结果是数据并没有排序,所以在程序中固定了要排序的数据。
5.设计体会通过这次实验我也着实又感受了一次编程的乐趣,从中也学到了不少知识。
做程序是一个比较累的工作,特别是当遇到困难时,程序通不过时,真的很令人沮丧。
但是改正一个错误时,那种喜悦心情也很令人期盼,这种心情堪比久旱见甘霖的喜悦。
就是因为有这种令人身心愉悦的可能,我才得以能够整晚不睡来改程序中的不足之处。
编程中有苦有乐,其中的苦乐只有亲身经历才能体会到。
要想做出好的程序,必须做好忍受其间痛苦的准备。
虽然都说“程序=数据结构+算法”,但我在学习运用数据结构编程之前,并没能深刻体会到这一点,直到这次课设实践。
我感受最深的一点是:以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。
感觉有点像张飞打仗,有勇无谋,只要能完成任务就行。
但现在编程感觉完全不同了。
在编写一个程序之前,自己能够综合考虑各种因素,首先选取自己需要的数据结构,是树还是图或是别的什么?然后选定一种或几种存储结构来具体的决定后面的函数的主要风格。
最后在编写每一个函数之前,可以仔细斟酌比对,挑选出最适合当前状况的算法。
这样,即使在完整的程序还没有写出来之前,自己心中已经有了明确的原图了。
这样无形中就提高了自己编写的程序的质量。
另外,我还体会到深刻理解数据结构的重要性。
只有真正理解这样定义数据类型的好处,才能用好这样一种数据结构。
了解典型数据结构的性质是非常有用的,它往往是编写程序的关键。
这次实验中我也出现过一些比较困难的地方。
在对数据进行模型化的时候,只用数组不能足以获取数据的信息,必须建立一个结构体。
后来在同学的指点下,意识到自己的错误。
不过收获也很不少。
总之,我会继续我的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步不断提高的。
6.结束语本程序实现了清屏操作和数据的归并排序,主要是2-路归并排序的过程,程序运行简单易行,可操作性可靠,结果明了。
参考文献[1] 王开铸,俞经善,金虎,李秀坤.《C语言数据结构程序设计》,哈尔滨工业大学出版社,2003年1月[2] 严蔚敏,吴伟名.《数据结构》,清华大学出版社,2001年1月[3]赵仲孟,张蓓.《数据结构》,西北工业大学出版社,2001年9月。