内部排序算法比较课程设计报告种基本排序
- 格式:docx
- 大小:25.67 KB
- 文档页数:15
数据结构课程设计—内部排序算法比较在计算机科学领域中,数据的排序是一项非常基础且重要的操作。
内部排序算法作为其中的关键部分,对于提高程序的运行效率和数据处理能力起着至关重要的作用。
本次课程设计将对几种常见的内部排序算法进行比较和分析,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。
冒泡排序是一种简单直观的排序算法。
它通过重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。
这种算法的优点是易于理解和实现,但其效率较低,在处理大规模数据时性能不佳。
因为它在最坏情况下的时间复杂度为 O(n²),平均时间复杂度也为O(n²)。
插入排序的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入,直到整个序列有序。
插入排序在数据量较小时表现较好,其平均时间复杂度和最坏情况时间复杂度也都是 O(n²),但在某些情况下,它的性能可能会优于冒泡排序。
选择排序则是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。
以此类推,直到全部待排序的数据元素排完。
选择排序的时间复杂度同样为O(n²),但它在某些情况下的交换操作次数可能会少于冒泡排序和插入排序。
快速排序是一种分治的排序算法。
它首先选择一个基准元素,将数列分成两部分,一部分的元素都比基准小,另一部分的元素都比基准大,然后对这两部分分别进行快速排序。
快速排序在平均情况下的时间复杂度为 O(nlogn),最坏情况下的时间复杂度为 O(n²)。
然而,在实际应用中,快速排序通常表现出色,是一种非常高效的排序算法。
归并排序也是一种分治算法,它将待排序序列分成若干个子序列,每个子序列有序,然后将子序列合并成一个有序序列。
数据结构课程设计报告几种排序算法的演示1、需求分析:运行环境:Microsoft Visual Studio 20052、程序实现功能:3、通过用户键入的数据, 经过程序进行排序, 最后给予数据由小到大的输出。
排序的方式包含教材中所介绍的几种常用的排序方式:直接插入排序、折半插入排序、冒泡排序、快速排序、选择排序、堆排序、归并排序。
每种排序过程中均显示每一趟排序的细节。
程序的输入:输入所需排序方式的序号。
输入排序的数据的个数。
输入具体的数据元素。
程序的输出:输出排序每一趟的结果, 及最后排序结果1、设计说明:算法设计思想:a交换排序(冒泡排序、快速排序)交换排序的基本思想是: 对排序表中的数据元素按关键字进行两两比较, 如果发生逆序(即排列顺序与排序后的次序正好相反), 则两者交换位置, 直到所有数据元素都排好序为止。
b插入排序(直接插入排序、折半插入排序)插入排序的基本思想是: 每一次设法把一个数据元素插入到已经排序的部分序列的合适位置, 使得插入后的序列仍然是有序的。
开始时建立一个初始的有序序列, 它只包含一个数据元素。
然后, 从这个初始序列出发不断插入数据元素, 直到最后一个数据元素插到有序序列后, 整个排序工作就完成了。
c选择排序(简单选择排序、堆排序)选择排序的基本思想是: 第一趟在有n个数据元素的排序表中选出关键字最小的数据元素, 然后在剩下的n-1个数据元素中再选出关键字最小(整个数据表中次小)的数据元素, 依次重复, 每一趟(例如第i趟, i=1, …, n-1)总是在当前剩下的n-i+1个待排序数据元素中选出关键字最小的数据元素, 作为有序数据元素序列的第i个数据元素。
等到第n-1趟选择结束, 待排序数据元素仅剩下一个时就不用再选了, 按选出的先后次序所得到的数据元素序列即为有序序列, 排序即告完成。
d归并排序(两路归并排序)1、两路归并排序的基本思想是: 假设初始排序表有n个数据元素, 首先把它看成是长度为1的首尾相接的n个有序子表(以后称它们为归并项), 先做两两归并, 得n/2上取整个长度为2的归并项(如果n为奇数, 则最后一个归并项的长度为1);再做两两归并, ……, 如此重复, 最后得到一个长度为n的有序序列。
数据结构实验报告本文是范文,仅供参考写作,禁止抄袭本文内容上传提交,违者取消写作资格,成绩不合格!实验名称:排序算法比较提交文档学生姓名:提交文档学生学号:同组成员名单:指导教师姓名:排序算法比较一、实验目的和要求1、设计目的1.掌握各种排序的基本思想。
2.掌握各种排序方法的算法实现。
3.掌握各种排序方法的优劣分析及花费的时间的计算。
4.掌握各种排序方法所适应的不同场合。
2、设计内容和要求利用随机函数产生30000个随机整数,利用插入排序、起泡排序、选择排序、快速排序、堆排序、归并排序等排序方法进行排序,并统计每一种排序上机所花费的时间二、运行环境(软、硬件环境)软件环境:Vc6.0编程软件运行平台: Win32硬件:普通个人pc机三、算法设计的思想1、冒泡排序:bubbleSort()基本思想: 设待排序的文件为r[1..n]第1趟(遍):从r[1]开始,依次比较两个相邻记录的关键字r[i].key和r[i+1].key,若r[i].key>r[i+1].key,则交换记录r[i]和r[i+1]的位置;否则,不交换。
(i=1,2,...n-1)第1趟之后,n个关键字中最大的记录移到了r[n]的位置上。
第2趟:从r[1]开始,依次比较两个相邻记录的关键字r[i].key和r[i+1].key,若r[i].key>r[i+1].key,则交换记录r[i]和r[i+1]的位置;否则,不交换。
(i=1,2,...n-2)第2趟之后,前n-1个关键字中最大的记录移到了r[n-1]的位置上,作完n-1趟,或者不需再交换记录时为止。
2、选择排序:selSort()每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在已排好序的数列的最后,直到全部待排序的数据元素排完。
选择排序不像冒泡排序算法那样先并不急于调换位置,第一轮(k=1)先从array[k]开始逐个检查,看哪个数最小就记下该数所在的位置于minlIndex中,等一轮扫描完毕,如果找到比array[k-1]更小的元素,则把array[minlIndex]和a[k-1]对调,这时array[k]到最后一个元素中最小的元素就换到了array[k-1]的位置。
各种排序算法的课程设计一、课程目标知识目标:1. 让学生掌握排序算法的基本概念,了解不同排序算法的优缺点及应用场景。
2. 使学生能够理解和掌握冒泡排序、选择排序、插入排序等基本排序算法的原理和实现方法。
3. 帮助学生理解排序算法的时间复杂度和空间复杂度,并能够分析不同算法的效率。
技能目标:1. 培养学生运用编程语言实现排序算法的能力,提高编程实践操作技能。
2. 培养学生通过分析问题,选择合适的排序算法解决实际问题的能力。
情感态度价值观目标:1. 激发学生对计算机科学和算法的兴趣,培养主动探究和自主学习的精神。
2. 培养学生面对问题时的耐心和细心,提高解决问题的信心和团队合作意识。
3. 使学生认识到排序算法在生活中的广泛应用,体会算法对人类社会的贡献。
课程性质分析:本课程为计算机科学相关学科,旨在让学生掌握排序算法的基本原理和实现方法,提高编程实践能力。
学生特点分析:学生处于年级中段,具有一定的编程基础和逻辑思维能力,对新鲜事物充满好奇心,但学习耐心和自律性有待提高。
教学要求:1. 注重理论与实践相结合,提高学生的实际操作能力。
2. 通过案例分析,引导学生主动思考,提高问题解决能力。
3. 创设互动、轻松的学习氛围,关注学生个体差异,激发学习兴趣。
二、教学内容1. 排序算法基本概念:介绍排序的定义、排序算法的稳定性、内排序与外排序的分类。
2. 冒泡排序:讲解冒泡排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
3. 选择排序:介绍选择排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
4. 插入排序:讲解插入排序的原理、实现步骤,分析其时间复杂度和空间复杂度。
5. 排序算法比较:对比冒泡排序、选择排序和插入排序的优缺点,探讨在不同场景下如何选择合适的排序算法。
6. 教学案例:结合实际案例,让学生动手实践排序算法,提高编程能力。
7. 排序算法拓展:简要介绍其他常用排序算法(如快速排序、归并排序等)的原理和应用。
⽤Java实现常见的8种内部排序算法⼀、插⼊类排序插⼊类排序就是在⼀个有序的序列中,插⼊⼀个新的关键字。
从⽽达到新的有序序列。
插⼊排序⼀般有直接插⼊排序、折半插⼊排序和希尔排序。
1. 插⼊排序1.1 直接插⼊排序/*** 直接⽐较,将⼤元素向后移来移动数组*/public static void InsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i]; //temp ⽤于存储元素,防⽌后⾯移动数组被前⼀个元素覆盖int j;for(j = i; j > 0 && temp < A[j-1]; j--) { //如果 temp ⽐前⼀个元素⼩,则移动数组A[j] = A[j-1];}A[j] = temp; //如果 temp ⽐前⼀个元素⼤,遍历下⼀个元素}}/*** 这⾥是通过类似于冒泡交换的⽅式来找到插⼊元素的最佳位置。
⽽传统的是直接⽐较,移动数组元素并最后找到合适的位置*/public static void InsertSort2(int[] A) { //A[] 是给定的待排数组for(int i = 0; i < A.length - 1; i++) { //遍历数组for(int j = i + 1; j > 0; j--) { //在有序的序列中插⼊新的关键字if(A[j] < A[j-1]) { //这⾥直接使⽤交换来移动元素int temp = A[j];A[j] = A[j-1];A[j-1] = temp;}}}}/*** 时间复杂度:两个 for 循环 O(n^2)* 空间复杂度:占⽤⼀个数组⼤⼩,属于常量,所以是 O(1)*/1.2 折半插⼊排序/** 从直接插⼊排序的主要流程是:1.遍历数组确定新关键字 2.在有序序列中寻找插⼊关键字的位置* 考虑到数组线性表的特性,采⽤⼆分法可以快速寻找到插⼊关键字的位置,提⾼整体排序时间*/public static void BInsertSort(int[] A) {for(int i = 1; i < A.length; i++) {int temp = A[i];//⼆分法查找int low = 0;int high = i - 1;int mid;while(low <= high) {mid = (high + low)/2;if (A[mid] > temp) {high = mid - 1;} else {low = mid + 1;}}//向后移动插⼊关键字位置后的元素for(int j = i - 1; j >= high + 1; j--) {A[j + 1] = A[j];}//将元素插⼊到寻找到的位置A[high + 1] = temp;}}2. 希尔排序希尔排序⼜称缩⼩增量排序,其本质还是插⼊排序,只不过是将待排序列按某种规则分成⼏个⼦序列,然后如同前⾯的插⼊排序⼀般对这些⼦序列进⾏排序。
《数据结构与算法》实验报告一、需求分析问题描述:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。
试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
基本要求:(l)对以下6种常用的内部排序算法进行比较:起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、堆排序。
(2)待排序表的表长不小于100000;其中的数据要用伪随机数程序产生;至少要用5组不同的输入数据作比较;比较的指标为有关键字参加的比较次数和关键字的移动次数(关键字交换计为3次移动)。
(3)最后要对结果作简单分析,包括对各组数据得出结果波动大小的解释。
数据测试:二.概要设计1.程序所需的抽象数据类型的定义:typedef int BOOL; //说明BOOL是int的别名typedef struct StudentData { int num; //存放关键字}Data; typedef struct LinkList { int Length; //数组长度Data Record[MAXSIZE]; //用数组存放所有的随机数} LinkList int RandArray[MAXSIZE]; //定义长度为MAXSIZE的随机数组void RandomNum() //随机生成函数void InitLinkList(LinkList* L) //初始化链表BOOL LT(int i, int j,int* CmpNum) //比较i和j 的大小void Display(LinkList* L) //显示输出函数void ShellSort(LinkList* L, int dlta[], int t,int* CmpNum, int* ChgNum) //希尔排序void QuickSort (LinkList* L, int* CmpNum, int* ChgNum) //快速排序void HeapSort (LinkList* L, int* CmpNum, int* ChgNum) //堆排序void BubbleSort(LinkList* L, int* CmpNum, int* ChgNum) //冒泡排序void SelSort(LinkList* L, int* CmpNum, int* ChgNum) //选择排序void Compare(LinkList* L,int* CmpNum, int* ChgNum) //比较所有排序2 .各程序模块之间的层次(调用)关系:二、详细设计typedef int BOOL; //定义标识符关键字BOOL别名为int typedef struct StudentData //记录数据类型{int num; //定义关键字类型}Data; //排序的记录数据类型定义typedef struct LinkList //记录线性表{int Length; //定义表长Data Record[MAXSIZE]; //表长记录最大值}LinkList; //排序的记录线性表类型定义int RandArray[MAXSIZE]; //定义随机数组类型及最大值/******************随机生成函数********************/void RandomNum(){int i; srand((int)time(NULL)); //用伪随机数程序产生伪随机数for(i=0; i小于MAXSIZE; i++) RandArray[i]<=(int)rand(); 返回;}/*****************初始化链表**********************/void InitLinkList(LinkList* L) //初始化链表{int i;memset(L,0,sizeof(LinkList));RandomNum();for(i=0; i小于<MAXSIZE; i++)L->Record[i].num<=RandArray[i]; L->Length<=i;}BOOL LT(int i, int j,int* CmpNum){(*CmpNum)++; 若i<j) 则返回TRUE; 否则返回FALSE;}void Display(LinkList* L){FILE* f; //定义一个文件指针f int i;若打开文件的指令不为空则//通过文件指针f打开文件为条件判断{ //是否应该打开文件输出“can't open file”;exit(0); }for (i=0; i小于L->Length; i++)fprintf(f,"%d\n",L->Record[i].num);通过文件指针f关闭文件;三、调试分析1.调试过程中遇到的问题及经验体会:在本次程序的编写和调试过程中,我曾多次修改代码,并根据调试显示的界面一次次调整代码。
排序算法课课程设计书一、教学目标本节课的学习目标主要包括以下三个方面:1.知识目标:学生需要掌握排序算法的概念、原理和常见的排序算法(如冒泡排序、选择排序、插入排序等);理解排序算法的应用场景和性能特点,能够根据实际问题选择合适的排序算法。
2.技能目标:学生能够运用排序算法解决实际问题,具备编写排序算法代码的能力;能够对给定的数据集进行排序,并分析排序算法的执行时间和空间复杂度。
3.情感态度价值观目标:培养学生对计算机科学和算法的兴趣,使其认识算法在实际生活中的重要性,培养学生的创新意识和团队合作精神。
通过对本节课的学习,学生应能够了解排序算法的相关知识,掌握常见的排序算法,具备运用排序算法解决实际问题的能力,并培养对计算机科学和算法的兴趣。
二、教学内容本节课的教学内容主要包括以下几个部分:1.排序算法的概念和原理:介绍排序算法的定义、分类和性能评价指标。
2.常见排序算法:讲解冒泡排序、选择排序、插入排序等基本排序算法,并通过实例演示其实现过程。
3.排序算法的应用场景和性能特点:分析不同排序算法在实际应用中的优缺点,引导学生根据问题特点选择合适的排序算法。
4.排序算法的代码实现:让学生动手编写排序算法代码,培养其编程能力。
5.排序算法的执行时间和空间复杂度分析:讲解排序算法的时间复杂度、空间复杂度概念,并分析不同排序算法的复杂度。
通过对本节课的教学内容的学习,学生应能够掌握排序算法的相关知识,了解常见的排序算法,并具备运用排序算法解决实际问题的能力。
三、教学方法为了提高教学效果,本节课将采用以下教学方法:1.讲授法:教师讲解排序算法的相关概念、原理和算法实现,引导学生掌握排序算法的基本知识。
2.案例分析法:通过分析实际应用场景,让学生了解排序算法的应用价值和性能特点。
3.实验法:让学生动手编写排序算法代码,培养其编程能力和实际操作能力。
4.讨论法:分组讨论排序算法的优缺点,引导学生学会分析问题、解决问题。
合肥学院计算机科学与技术系课程设计报告2017 ~ 2018 学年第一学期课程数据结构与算法课程设计名称内部排序算法比较学生姓名操彦学号专业班级计算机科学与技术系15级 2 班指导教师2017 年 9 月1、问题分析和任务定义各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间,存在一定的却缺陷。
我们将通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
所设计的程序应能够将产生的随机数据同时用不同的内部排序算法排序,并列出关键字比较次数与移动次数,方便比较。
待排序表的表长不少于100,为方便起见,我们令表长等于100,用5组随机的数据排序的结果作比较。
2、数据结构的选择和概要设计一.可能排序表的抽象数据类型定义:ADT OrderableList{数据对象:D={|∈IntegerSet,i=1,2,……,n,n≥0}数据关系:R1={<,|,∈D,i=2,……n}基本操作:InitList(n)操作结果:构造一个长度为n,元素值依次为1,2,……,n的有序表。
RandomizeList(d,isInverseOrder)操作结果:首先根据isInverseOrder为True或False,将表置为逆序或正序,然后将表进行d(0≤d ≤8)级随机打乱。
d为0时表不打乱,d越大,打乱程度越高。
RecallList()操作结果:恢复最后一次用RandomizeList随机大乱的可排序表。
ListLength()操作结果:返回可排序的长度。
ListEmpty()操作结果:若可排序表为空表,则返回True,否则返回False。
BubbleSort(&c,&s)操作结果:进行冒泡排序,返回关键字比较次数c和移动次数s。
InsertSort(&c,&s)操作结果:进行插入排序,返回关键字比较次数c和移动次数s。
SelectSort(&c,&s)操作结果:进行选择排序,返回关键字比较次数c和移动次数s。
QuickSort(&c,&s)操作结果:进行快速排序,返回关键字比较次数c和移动次数s。
ShellSort(&c,&s)操作结果:进行希尔排序,返回关键字比较次数c和移动次数s。
HeapSort(&c,&s)操作结果:进行堆排序,返回关键字比较次数c和移动次数s。
ListTraveres(visit())操作结果:依次对L中的每个元素调用函数visit()。
}ADT OrderableList二.概要设计:1.冒泡排序:冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。
即在第一趟:首先比较第1个和第2个数,将小数放前,大数放后。
然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。
至此第一趟结束,将最大的数放到了最后。
在第二趟:仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到倒数第二个数(倒数第一的位置上已经是最大的),第二趟结束,在倒数第二的位置上得到一个新的最大数(其实在整个数列中是第二大的数)。
如此下去,重复以上过程,直至最终完成排序。
2.直接插入排序:直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已牌号序的有序表中,从而得到一个新的、记录数增1的有序表。
3.简单选择排序:在要排序的一组数中,选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环。
4.希尔排序:希尔排序又称“缩小增量排序”,它也是一种属插入排序类的方法,但在时间效率上较前述集中排序方法有较大的改进。
它的基本思想是:先将整个待排序记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
5.堆排序:由二叉堆的定义可知,堆顶元素(即二叉堆的根节点)一定为堆中的最大值或最小值,因此如果我们输出堆顶元素后,将剩余的元素再调整为二叉堆,继而再次输出堆顶元素,再将剩余的元素调整为二叉堆,反复执行该过程,这样便可输出一个有序序列,这个过程我们就叫做堆排序。
6.归并排序:归并的含义很明显就是将两个或者两个以上的有序表组合成一个新的有序表。
归并排序中一般所用到的是2-路归并排序,即将含有n个元素的序列看成是n个有序的子序列,每个子序列的长度为1,而后两两合并,得到n/2个长度为2或1的有序子序列,再进行两两合并。
直到最后由两个有序的子序列合并成为一个长度为n的有序序列。
2-路归并的核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列。
7.快速排序:快速排序的基本实现思想就是将当前待排序列分成两个部分、一个值。
一个值:就是选定出一个值作为被比较的元素。
两个部分:所有比该被选定元素大的部分都去该元素的右边,所有比被选定元素小的部分都去该元素的左边。
这样我们就确定了该元素在这个待排序列中的位置,其实也就是我们已经将这个元素“排好了”。
3、详细设计和编码1.冒泡排序:void gensort(int b[],int n){int i,j;int s=0,t=0;for(i=0;i<n-1;i++){for(j=i+1;j<n;j++){t++;if(b[i]>b[j]){int temp=b[i];b[i]=b[j];b[j]=temp;s+=3;}}}cout<<"移动次数="<<s<<","<<"比较次数="<<t<<endl;}2.直接插入排序:void insertsort(sqlist b,int n){int i,j;int s=0,t=0;for(i=2;i<n;i++){b[0]=b[i];s++;j=i-1;t++;while(b[0].key<b[j].key){b[j+1]=b[j];j--;s++;t++;}b[j+1]=b[0];s++;}cout<<"移动次数="<<s<<","<<"比较次数="<<t<<endl; }3.简单选择排序:void gentsort(int b[],int n){int i,j,k;int s=0,t=0;for(i=0;i<n-1;i++){k=i;for(j=i+1;j<n;j++){t++;if(b[k]>b[j]){k=j;}}if(k!=i){int temp=b[k];b[k]=b[i];b[i]=temp;s+=3;}}cout<<"移动次数="<<s<<","<<"比较次数="<<t<<endl; }4.希尔排序:void shellsort(sqlist b,int n){int i,j,gap;rec x;int s=0,t=0;gap=n/2;while(gap>0){for(i=gap+1;i<n;i++){j=i-gap;while(j>0){t++;if(b[j].key>b[j+gap].key){x=b[j];b[j]=b[j+gap];b[j+gap]=x;j=j-gap;s+=3;}else j=0;gap=gap/2;}}cout<<"移动次数="<<s<<","<<"比较次数="<<t<<endl; }}5.堆排序:void sift(sqlist r,int s,int m){int j;rec x;x=r[s];for(j=2*s;j<=m;j*=2){q++;if(j<m&&(r[j].key<r[j+1].key))++j;q++;if(!(x.key<r[j].key)) break;r[s]=r[j];s=j;p++;}r[s]=x;p++;}void heapsort(sqlist &r,int m){int i;rec w;for(i=m/2;i>0;--i)sift(r,i,m);for(i=m;i>1;--i){w=r[i];r[i]=r[1];r[1]=w;p+=3;sift(r,1,i-1);}}void sorting(sqlist &r,int t){BeforeSort();heapsort(r,t);display(p,q);}void init(int a[]){//随机生成N个整数并int i;srand ( ( unsigned int ) time ( NULL ) );for(i=0;i<N;i++)a[i]=rand()%99+1;}6.归并排序:#include <stdio.h>void cutTwo(int sourceArr[],int *tempArr[],int start,int end);void merge(int sourceArr[],int *tempArr[],int start,int mid,int end); int main(int argc, char *argv[]){int a[8]={50, 10, 20, 30, 70, 40, 80, 60};int *b[8]={};int i;cutTwo(a,b,0,8);for(i=0;i<8;i++){printf("%d ",a[i]);}return 0;}/*归并排序算法:*/void merge(int sourceArr[],int *tempArr[],int start,int mid,int end){//当前我们有一个源数组,我们在比较时将这个源数组一分为二进行比较归并排序/*因为我们要进行归并排序,所以我们需要两个指针分别指向两个子序列的开始位置,即start指向左边部分的开始位置,mid+1指向右边部分的开始位置,我们还需要一个k的下标,用于存储我们交换过来的数组到临时数组tempArr[]*/int i=start; //定义一个i下标,用于表示左边部分开始的位置下标int j=mid+1; //定义一个j下标,用于表示右边部分开始的位置下标int k=0;/*因为我们在比较时是不断的比较,直到一个子序列到达最后,所以我们应该用while循环来做,结束条件:无非就是左边序列到头了或者是右边序列到头了,即:i<=mid&&j<=end 只有在这两个条件都成立的条件下说明两个子序列都没有到头*/while(i<=mid&&j<=end){ //当i=mid+1或者j=end+1时说明子序列中有一个到头了,则跳出循环 if(sourceArr[i]<=sourceArr[j]){ //表示当前i比较小,那么我们就将小的值赋给ktempArr[k]=sourceArr[i];k=k+1;i=i+1;}else{tempArr[k]=sourceArr[j];k=k+1;j=j+1;}/*不能将k,i,j的加1操作放在if else判断的外面,因为我们在进行比较的时候,只是将下标所指的数字小的放在左边,将下标所指的数字大的不动,因为我们小的下标加1后还要和刚才下标所指的数字再次进行比较,如果放在外面,那么我们的比较的对象不对了(因为的大的数字的下标加1了,前面的一个数字没有进行比较)*/}/*当有一个子序列到头以后,我们就要将剩余没到头的子序列的剩余元素放到k的右边,因为剩余的肯定是已经有序的,且肯定比已经到头的子序列的全部元素都要大的。