算法导论笔记一:算法设计之分治法
来源:互联网 发布:tweenmax.js 百叶窗 编辑:程序博客网 时间:2024/05/16 11:56
分治法的设计思想是利用某些算法递归的特性,将原问题分解为n个结构相似的子问题,递归解决这些子问题,在合并其结果,便得到原问题的解,代表算法为合并排序法。
合并排序法的原理是将原序列分为两个子序列,将两个子序列分别排序后进行合并,得到一个完整的排序序列。序列分解的最终结果是含有一个元素,单个元素即可视为已排序序列。合并排序的关键步骤是两个已排序序列的合并,其代码如下。
#include <iostream>using namespace std;void merge(int *a,int p,int r,int q){ int n1=r-p+1; int n2=q-r; int *in1=new int[n1]; int *in2=new int[n2]; for(int i=0;i<n1;++i) { in1[i]=a[i+p]; } for(int i=0;i<n2;++i) { in2[i]=a[i+r+1]; } int j=0,k=0; for(int i=0;i<n1+n2;++i) { if(j>=n1) { a[i+p]=in2[k]; k++; } else if(k>=n2) { a[i+p]=in1[j]; j++; } else { if(in1[j]<in2[k]) { a[i+p]=in1[j]; j++; } else { a[i+p]=in2[k]; k++; } } }}void merge_sort(int *a,int p,int q){ if(p<q) { int r=(p+q)/2; merge_sort(a,p,r); merge_sort(a,r+1,q); merge(a,p,r,q); }}int main(){ cout<<"please input 10 numbers:"<<endl; int a[10]; for(int i=0;i<10;++i) { cin>>a[i]; } merge_sort(a,0,9); for(int i=0;i<10;++i) cout<<a[i]<<"\t"; cout<<endl; return 1;}
- 算法导论笔记一:算法设计之分治法
- 算法导论之分治法
- 算法导论之分治法
- 算法导论之分治法
- 算法导论第二版笔记之分治法
- 算法导论学习笔记(一)排序算法之分治排序
- 【算法导论】分治法
- 算法导论--分治法
- 算法导论学习之分治法
- 算法设计之分治法
- 设计算法之分治法
- 分治之最大子数组-《算法导论》学习笔记四
- 算法导论:分治法(2)
- 算法导论--分治法--P17
- 算法设计之分治
- 《算法导论》笔记一
- 算法导论 第四章:分治法(一)
- MIT算法导论学习笔记-Lecture3:分治法
- C++面试题
- 每日一题(68) - 复杂链表的复制
- 公告
- flex布局
- NSNotificationCenter 的详细说明
- 算法导论笔记一:算法设计之分治法
- Unity3D 面试
- 黑马程序员—IO流(上)字符流、字节流
- 香港或国外服务器如何提高访问速度
- 基于Platinum库的DMS实现(android)
- hdu 2227 Find the nondecreasing subsequences【离散化+树状数组+DP思路】
- 这是我要走的路
- 自己写的QQ美女找茬外挂
- 主线程与子线程之间退出关系