• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 算法详解之分治法具体实现

算法详解之分治法具体实现

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了分治法详解,算法分析 分治法,算法设计与分析分治法,分治法算法,用分治法实现快速排序等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同。求出子问题的解,就可得到原问题的解。

分治法解题的一般步骤:

(1)分解,将要解决的问题划分成若干规模较小的同类问题;

(2)求解,当子问题划分得足够小时,用较简单的方法解决;

(3)合并,按原问题的要求,将子问题的解逐层合并构成原问题的解。

一言以蔽之:分治法的设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

在认识分治之前很有必要先了解一下递归,当然,递归也是最基本的编程问题,一般接触过编程的人都会对递归有一些认识.为什么要先了解递归呢?你看,根据上面所说的,我们就要将一个问题分成若干个小问题,然后一一求解并且最后合并,这就是一个递归的问题,递归的去分解自身,递归的去解决每一个小问题,然后合并…

关于递归,这里举一个最简单的例子,求N!;

我们只需要定义函数

{

if(n==1)

return 1;

else

  return n*calculate(n-1);   //调用自身…

}
</div>

好了,有了递归的铺垫,我们下来来看一看一个分治算法的问题,归并排序问题…

基本思想:

将待排序元素分成大小大致相同的2个子集合(递归直到最小的排序单元),分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。

下面我们用一张图来展示整个流程,最下面的(姑且叫他第一层)是原始数组分成了8个最小排序问题,各自只有一个元素,故不需要排序,大家可以看到,我们通过分而治之的思想把对最初数组的排序分为了若干个只有一个元素的小数组的排序,然后第二层,我们进行了合并,将每两个最小排序结果合并为有两个元素的数组,然后逐层往上进行合并,就有了最后的结果…

下面我们来看一下这个算法的具体实现,下面的MERGE-SORT (A, p, r)表示对数组A[p->r]的排序过程.其中p->r代表从p到r.

MERGE-SORT (A, p, r)

1.     IF p < r                                                    // 进行A[p->r]的排序过程自然需要p<r的前提条件

2.         THEN q = [(p + r)/2]                           // 将当前的排序问题一分为二,分别进行处理

3.                 MERGE-SORT (A, p, q)                //继续递归看能不能将问题继续一分为二,处理A[p->q]的排序

4.                 MERGE-SORT (A, q + 1, r)          // 继续递归看能不能将问题继续一分为二处理A[q+1->r]的排序

5.                 MERGE (A, p, q, r)                       // 合并当前结果

到这里,分治算法的精髓已经出来了,我们通过递归将问题进行分解到足够小…继而进行结果计算…然后再将结果合并.

下面来处理一下边角料的工作,呵呵,让大家看到一个完整的归并排序的例子,整个算法总结系列我都没有很好的使用伪代码,而是使用我认为广泛使用的C语言代码来进行代码诠释.实际上,描述算法最好还是使用伪代码比较好,这里我对我前面的四篇文章没有使用伪代码而小小的鄙视一下自己,太不专业了..呵呵

以下算法MERGE (A, p, q, r )表示合并A[p->q]和A[q+1->r]这两个已经排序好的数组

MERGE (A, p, q, r )

1.      n1 ← q − p + 1                                                          //计算A[p->q]的长度
2.      n2 ← r − q                                                                //计算A[q+1->r]的长度
3.      Create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]       //创建两个数组
4.      FOR i ← 1 TO n1
5.            DO L[i] ← A[p + i − 1]
6.      FOR j ← 1 TO n2
7.            DO R[j] ← A[q + j ]        //4-7行是将原数组中A[p->r]的元素取出到新创建的数组,我们的操作是基于临时数组的操作
8.      L[n1 + 1] ← ∞
9.      R[n2 + 1] ← ∞                   //8-9行设置界限..
10.    i ← 1
11.    j ← 1
12.    FOR k ← p TO r
13.         DO IF L[i ] ≤ R[ j]
14.                THEN A[k] ← L[i]
15.                        i ← i + 1
16.                ELSE A[k] ← R[j]
17.                        j ← j + 1                //12-17行进行排序合

这里我还是提供一个具体的实现,请见下面的代码

C语言代码

关于代码注释,请见博客上面的伪代码注释..

 

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 算法详解之分治法具体实现

相关文章

  • 2017-05-28C++编程中的数据类型和常量学习教程
  • 2017-05-28c语言输出字符串中最大对称子串长度的3种解决方案
  • 2017-08-27UVa11402 Ahoy, Pirates!
  • 2017-05-28C语言构建动态数组完整实例
  • 2017-05-28VC++开发中完美解决头文件相互包含问题的方法解析
  • 2017-05-28C语言编程中建立和解除内存映射的方法
  • 2017-05-28C++普通函数指针与成员函数指针实例解析
  • 2017-05-28CString,字符串,整数等相互转换方法(推荐)
  • 2017-05-28C 二分查找 递归与非递归的实现代码
  • 2017-05-28解读堆排序算法及用C++实现基于最大堆的堆排序示例

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++ 使用Json封装数据和解析数据
    • C语言切割多层字符串(strtok_r strtok使用方法)
    • C++实现图形界面时钟表盘代码
    • C++封装IATHOOK类实例
    • 解析C语言中如何正确使用const
    • 详谈全排列next_permutation() 函数的用法(推荐)
    • C语言 volatile与const同时使用应注意的问题
    • C++标准库中sstream与strstream的区别详细解析
    • 希尔排序算法的C语言实现示例
    • C语言 结构体和指针详解及简单示例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有