归并排序
来源:互联网 发布:足彩大数据分析哪里看 编辑:程序博客网 时间:2024/06/14 07:56
归并排序
归并排序(MergeSort)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
算法描述:
归并操作的工作原理如下:
第一步:申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
第二步:设定两个边界,最初位置分别为两个已经排序序列的起始位置
第三步:比较两个边界所指向的元素,选择相对小的元素放入到合并空间,并移动边界到下一位置
重复步骤3直到某一边界超出序列尾
将另一序列剩下的所有元素直接复制到合并序列尾
代码实现:
#include <stdio.h>#include <stdlib.h>void Merge(int arr[],int tmp[],int startIndex,int midIndex,int endIndex){int leftIndex = startIndex;int rightIndex = midIndex + 1;int tmpIndex = startIndex;while(leftIndex < midIndex + 1 && rightIndex < endIndex + 1)//如果左右边界没有越界{if(arr[leftIndex] > arr[rightIndex])//左边的元素值大{tmp[tmpIndex++] = arr[rightIndex++];}else{tmp[tmpIndex++] = arr[leftIndex++]; }}while(leftIndex < midIndex + 1)//右边越界{tmp[tmpIndex++] = arr[leftIndex++];}while(rightIndex < endIndex + 1)//左边越界{tmp[tmpIndex++] = arr[rightIndex++];}//将排序好之后的临时数组中的元素放回到原数组中for(int i = startIndex;i < endIndex + 1;i++){arr[i] = tmp[i];}}void MyMerge(int arr[],int tmp[],int startIndex,int endIndex){if(startIndex < endIndex){int midIndex = (endIndex + startIndex) / 2;MyMerge(arr,tmp,startIndex,midIndex);MyMerge(arr,tmp,midIndex + 1,endIndex);Merge(arr,tmp,startIndex,midIndex,endIndex);}}void MergeSort(int arr[],int len)//时间复杂度O(nlog2^n) 空间复杂度O(n){int *tmp = (int *)malloc(sizeof(int)*len);//动态申请一个临时数组MyMerge(arr,tmp,0,len - 1);}void Show(int arr[],int len){for(int i = 0;i < len ;i++){printf("%d ",arr[i]);}printf("\n");}int main(){int arr[] = {12,67,9,45,34,28,53,19,5,80};int len = sizeof(arr) / sizeof(arr[0]);MergeSort(arr,len);Show(arr,len);return 0;}
运行结果:
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- DLUTOJ 1158艾尔大停电(二分答案+预处理DP)
- DataNode之BlockSender分析
- 60个BCB(C++Build)初学者 应用实例
- android开发之代理模式
- 并查集 入门-HDU 1232
- 归并排序
- 基于NFS v4版本搭建NFS服务器
- RecyclerView嵌套RecyclerView 条目自动上滚的bug
- vue2 npm run build 打包出来的dist 文件夹资源引用加载错误
- Softmax函数与交叉熵
- 网易有道2017内推编程题:构造队列 [python]
- Mac下查看某个接口被占用的情况
- 设置VMWare桥接模式静态IP
- Intellij IDEA--can't use subversion command line client : svn