分治---合并排序
来源:互联网 发布:欧洲卡车模拟2 mac 编辑:程序博客网 时间:2024/05/16 08:38
并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序,合并排序也叫归并排序。
1、递归实现的合并排序
#include <iostream>#include <stdio.h>using namespace std;int a[] = {10,5,9,4,3,7,8};int b[7];template <class Type>void Merge(Type c[],Type d[],int l,int m,int r);template <class Type>void MergeSort(Type a[],int left,int right);int main(){ for(int i=0; i<7; i++) cout<<a[i]<<" "; cout<<endl; MergeSort(a,0,6); for(int i=0; i<7; i++) cout<<a[i]<<" "; cout<<endl;}template <class Type>void Merge(Type c[],Type d[],int l,int m,int r){//合并c[l:m]和c[m+1:r]到d[l:r] int i = l,j = m + 1,k = l; while((i<=m)&&(j<=r)) { if(c[i]<=c[j]) d[k++] = c[i++]; else d[k++] = c[j++]; } if(i>m) { for(int q=j; q<=r; q++) d[k++] = c[q]; } else { for(int q=i; q<=m; q++) d[k++] = c[q]; }}template <class Type>void MergeSort(Type a[],int left,int right){//递归合并 if(left<right) { int i = (left + right)/2; MergeSort(a,left,i); MergeSort(a,i+1,right); Merge(a,b,left,i,right);//合并到数组b //复制回数组a for(int g=left; g<=right; g++) a[g] = b[g]; }}2、合并排序非递归实现
从分支策略机制入手,可消除程序中的递归。非递归实现的大致思路是先将数组a中元素两两配对,用合并算法将它们排序,构成n/2组长度为2的排好的子数组段,然后再将它们排成长度为4的排好序的子数组段,如此继续下去,直到整个数组排好序。
(即:二路归并排序:见点击打开链接)
阅读全文
0 0
- 分治法合并排序
- 合并排序,分治思想
- 分治合并排序
- 分治法--合并排序
- 合并排序(分治)
- 分治法合并排序
- 分治法-----合并排序
- 分治算法-合并排序
- 分治法--合并排序
- 合并排序-递归分治
- 分治---合并排序
- 合并排序(分治法)
- 合并排序与分治法
- 分治法(合并排序)
- 分治--合并排序
- 分治算法—合并排序
- 分治算法之合并排序
- 合并排序(分治递归)
- Unity3D中通过Animator动画状态机获取任意animation clip的准确播放持续时长
- Spring Boot配置文件
- golang语言并发与并行——goroutine和channel的详细理解(一)
- 深入理解QT的SIGNAL\SLOT机制(一):SIGNAL\SLOT如何使用
- 在ftp上安装JDk
- 分治---合并排序
- 网络加载购物车自定义算价格
- HDOJ 2055 An easy problem
- golang语言并发与并行——goroutine和channel的详细理解(二)
- 代码块总结
- IT风投
- 框架结合之Spring和struts2
- lambda表达式10个示例
- Linux系统测试端口连通性的方法