【Lehr】【数据结构与算法】【C语言】归并排序
2019-06-05 15:38
211 查看
【Lehr】【数据结构与算法】【C语言】归并排序
具体代码
#include<stdio.h> //将两个有序数组合并的过程 void Merge(int* R, int start, int mid, int end) { //需要把元素全誊到这个新数组去 int A[end-start+1]; //i代表第一个有序数组的起始位置 int i = start; //j代表第二个有序数组的起始位置 int j = mid+1; //k用来逐个表示A数组中的元素 int k = 0; //从这两个有序数组中找出小的,逐个放入A数组 while(i<=mid && j<=end) { //j的小就放j if(R[i]>R[j]) { A[k] = R[j]; j++; } else { A[k] = R[i]; i++; } k++; } //当出现某个数组放完了之后,直接把另一个数组剩下的全放入A即可 //其实下面那两个if可以不写,只不过这里只是增强可读性而已.... if(i>mid) { while(j<=end) { A[k] = R[j]; j++; k++; } } if(j>end) { while(i<=mid) { A[k] = R[i]; i++; k++; } } //然后再把已经有序了的元素装回到原来啊的R数组 for(int m = 0;m<k;m++) { R[start] = A[m]; start++; } } //归并排序 void MergeSort(int* R, int start, int end) { //如果没把数组分到单个元素,就一直分治 if(start<end) { //一分为二 int mid = (start+end)/2; //左右两边排好序 MergeSort(R,start,mid); MergeSort(R,mid+1,end); //拼接到一起 Merge(R,start,mid,end); } } int main() { int M[6] = {1,5,3,7,8,2}; MergeSort(M,0,5); for(int i=0;i<6;i++) { printf("%d ", M[i]); } }
过程分析
这是冯诺依曼大佬提出的算法,利用了分治的思想,各层分治递归可以同时进行。所以我连分步解释的图都不好画了。。。。。。
不过总体流程大概是这样:
这个算法的主体思路就是把一个数组全部划分成单个元素,单个元素进行比较后合并。由于是递归,多个比较同时发生,所以会更快。每次在比较完后,会得到两个有序数组,只需要将有序数组合并即可(对于只用单个元素的情况,就是直接比大小了)。
我这里就只讲一下合并步骤的思路了。
合并步骤
1.得到两个有序数组,但是他们在空间上是连在一起的,他们以你之前划分的标准mid元素来分界。
2.所以两个数组的空间位置分别是
start—mid, mid+1—end-1
准备好指针,开始排序即可
3.由于他们的都是有序数组,从头逐个比较,取走小的那个即可。
比如:
A数组-----------1,6,7,9,9
B数组-----------2,3,4,5,8
那么我们先从A中取走1,再比较A的第二个元素和B的第一个元素,取走2,同理,继续比较,取走B中的3,然后4,然后5,然后再取A中的7,再取B中的。
4.这时,B数组已经取完了,只需要把剩下的A中的两个9全部放到数组里即可。
5.最后注意我们是把数组先有序地誊到一个空的数组里了,还要放回来,完成。
性能分析
相关文章推荐
- 【Lehr】【数据结构与算法】【C语言】二叉树及其相关操作
- 【Lehr】【数据结构与算法】【C语言】按照指定输入方式创建二叉树
- 【Lehr】【数据结构与算法】【C语言】二叉树的非递归遍历
- 【Lehr】【数据结构与算法】【C语言】二叉树的递归遍历
- 【Lehr】【数据结构与算法】【C语言】二叉树由两种遍历推出整棵树
- 数据结构之---C语言实现归并排序
- 数据结构之---C语言实现最短路径之Floyd(弗洛伊德)算法
- 【数据结构与算法】汉诺塔算法——C语言递归实现
- libcstl:标准C语言通用数据结构和常用算法库
- 数据结构与算法——二分查找(C语言)
- 【数据结构与算法】排序算法之五:归并排序
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 数据结构与算法之排序:堆排序、归并排序及快速排序
- 数据结构与算法-----归并排序
- 【数据结构与算法】排序算法之五:归并排序
- 数据结构及算法——求链式表的长度(C语言)
- [算法]数据结构算法背包问题解法之递归解法,C语言实现
- 数据结构与算法(C语言)<绪论>
- 数据结构与算法——先序输出叶结点(C语言)