程序设计方法与实践-减治法

《算法设计与分析基础》读书笔记 一、算法与问题 算法是解决问题的一系列步骤; 理解问题,设计算法的一般过程: 二、蛮力法 蛮力法是一种简单直观的解决问题的办法,常常直接基于问题的描述和所涉及的概念。蛮力法所能解决的问题域也是最广的,但是效率往往不高; 使用蛮力法的算法有: 1、冒泡排序,选择排序 2,、顺序匹配 3、穷举法 三、分治法 分治法设计步骤: 1、将问题实例划分为同一问题的较小的实 阅读详情

减治法原理

何为减治?减治法是通过减小问题规模,产生一个子问题,那么只要找到这个子问题的解,然后再找到子问题解与原问题解的关系,那么就成功解决了这个问题。当然,减治操作是可以递归的,问题规模当然越小越好,常见的减治法主要有:减常数规模、减常因子规模、减可变规模三种。

插入排序

插入排序是经典的排序算法,但其实从一个角度讲,它同样是一种的减治法的体现:假如现在有N个数,需要输出非递减序列。这当然很简单!

但让我们从分治法的角度来分析一下,我们要将N个数排序,如果第一个数本身就是有序的就好了!!!我们不妨假设,第一个数就是有序的,那我们当然希望第二个数也是有序的,对吧?那如果第二个数有序,我当然希望第三……咳咳!!!幻想当然是美好的,但我们还是要面对现实。但这个幻想却给我们提供了一个解决问题的角度,也就是排好第一个结点,然后不断减小待排序数的规模,直至问题解决。

那我们来实现以下,要排好第一个数,就先要找到最小的数,这一点毋庸置疑。同样这也很好解决,我们先默认第一个结点下标index是最小的,然后遍历一遍链表,碰见更小的结点就更新一下index。这样一遍下来,就可以得到最小的结点,那么我存好的这个结点后,问题的规模是不是就变小了!!!那么为了充分复用空间,我们直接在外层循环中将下标为index和下标为i的两个数调换顺序即可,此时我只关心第一个结点要放在首位,至于一开始的i节点被换到哪里去了,I don't care!!!

viod InsertionSort(a[N]){
    int index=0;
    for(int i=0;i<N;i++){
        index=i;
        for(int j=i+1;j<N-i;j++){
            if(a[index]>a[j])
            index=j;
        }
        int temp=a[index];
        a[index]=a[i];
        a[i]=temp;
    }
}

拓扑排序 

那么讲完了超级简单的插入排序,我们稍微进阶一下,来看一看比较简单的拓扑排序。

首先拓扑是数学中的一个概念,当然我们今天不讲数学(单纯因为我真的不不不……喜欢)。我们今天简单讲一讲在它在实际生活中的例子:

大家对课表肯定不陌生,但是一张课表是怎么排出来的呢?因为我们知道,课程的开设肯定是有顺序的,以计算机大类课程为例,C语言程序设计肯定要在数据结构之前开吧!!!所以说有些课程是有先后顺序的,而有些课程是可以并行开设的。那如果将这些课程抽象成结点,那么这些课程的关系应该是一个有向无环图。有人会问哦,为什么是一个有向无环图?其实很好理解,可以想象一下,如果你课表上有一门大四课程需要先学一门大一的课程,而你发现这门大一的课程又需要先学这门大四的课程……哇哦!!!(是先有鸡,还是先有蛋呢?)这样很好理解了吧。

那我现在将其抽象出来:

假如现在有四门课程,其开设的先后关系由箭头表示(优先开设指向后开设)。

这当然可以用深度优先遍历的出栈顺序解决,但我们试着从减治法的角度来解决这个问题。

我们先思考一下,哪些结点是毫无疑问优先放置的?当然是那些没有入度的结点!!!一个结点没有入度说明它不受其他结点的约束,也就意味着它可以被无脑地放在第一位。那我就可以去除这一个节点,爽爽爽!!!问题的规模似乎又又又减小啦。同理,重复此操作即可,我们就可以输出:

C1->C2->C3->C4->C5

当然拓扑排序可以是不唯一的。 

生成组合对象的算法

1.生成排列

排列问题是给定N个元素,生成其可能的全部序列。为简单起见,我们这里考虑,N各种整数的全部排列。

我们同样试着用减治的思想解决,先问大家一个问题,如果现在有N-1个数组成的序列(已给定),然后我将剩下的一个数随便插入两个数之间,会不会有重复的序列?

当然是没有的,其实很好理解,因为给定序列了,说明这N-1个数的相对位置已经确定了,所以不管第N个数插入哪里,所产生的序列都是唯一的。那么这就是,这道题可以用减治法解决的前提,简单说,完成N个数的排列,可以先完成N-1个数的排列。

 举一个例子,N=3,先排好一个数(只选一个即可);然后再取第二个数,按顺序从左到右插到现有序列中;最后一个数重复上述操作,如下:

  • -1-
  • -2-1-、-1-2-
  • -3-2-1-、-2-3-1-、-2-1-3-、-3-1-2-、-1-3-2-、-1-2-3-

PS:生成排列问题还可以用Johnson-Trotter算法、字典顺序生成算法,这里就不逐一介绍了。

2.生成子集

生成子集问题是指:给定由N个元素组成的集合A,求以集合A的所有子集为元素的集合。

试着用减治的思想来解决,我们先思考一下,假设任选一个元素a1,那么是不是幂集中的所有集合元素可以被划分为含a1的集合元素,以及不含a1的集合元素。并且将前者的每一个集合元素中加入a1,就变成了后者。有了这个思路,让我们反过来想,假如我们从集合A中任取一个元素ai,剩下的N-1个元素组成集合B,不妨假设有人已经求得了集合B的幂集。那么我们想要求集合A的幂集就会很简单,只需要将集合B的幂集中的每个集合元素中加上ai即可,最后之前的幂集合并哦。

举一个例子,N=3,则有集合A={1,2,3},先取一个元素(任选一个即可),写出它的幂集;然后再取一个元素,将其添加到上一步得到的幂集中,并补上空集,构成新的幂集;取最后一个元素,重复上述操作,如下:

  • {1},幂集:{ Ø,{1} }
  • {1,2},Ø∪{ 2 }={ 2 }、{ 1 }∪{ 2 }={ 1,2 }、与之前幂集合并,幂集:{ Ø,{1},{ 2 },{ 1,2 } }
  • { 1,2,3 },Ø∪{ 3 }={ 3 }、{ 1 }∪{ 3 }={ 1,3 }、{ 2 }∪{ 3 }={ 2,3 }、{ 1,2 }∪{ 3}={ 1,2,3 }、幂集:{ Ø,{1},{ 2 },{ 3 },{ 1,2 },{ 1,3 },{ 2,3 },{ 1,2,3 } }

PS:生成子集问题还可以位串法解决,效率会更快。

减常因子规模算法

折半查找

折半查找其实就是一个减治法的典型案例,每一次遍历都能将处理数据的规模减半,时间复杂度为logN,算得上一个比较优的算法了。

代码实现:

#include <stdio.h>
#include <stdlib.h>

int main (){
	int a[21];
	printf("请按非减顺序输入20个整数:\n");
	for(int i=1;i<=20;i++){
		scanf("%d",&a[i]);
	}
	int rel=0;
	int index=0;
	printf("请输入你查找的数:\n");
	scanf("%d",&rel);
	int low=1;
	int high=20;
	int mid;
	while(low<=high){
		mid=(low+high)/2;
		if(a[mid]==rel){
			break; 
		}
		if(rel<a[mid]){
			high=mid-1;
		}
		if(rel>a[mid]){
			low=mid+1;
		}
	}
	index=low;
	printf("%d的位置是:%d\n",rel,index);
	return 0;
	
} 

假币问题

问题简述:有N枚硬币,已知其中有一枚假币,并且假币的重量较轻。现有天枰,设计算法是的称最少次数找到这枚假币。

大家可以思考一下,我们一直假币的重量较轻,而天枰可以判断两堆硬币的重量。那我们不妨将所有硬币分成两堆(如果N为奇数,就剩下一枚),然后用天枰一称,不就知道假币在哪一堆里面了吗。

那么按照这种思路,每称一次,问题的规模就会减为一半 ,时间复杂度就为:

W(1)=0

W(N)=W(N/2)+1

由上面的递推公式,不难计算时间复杂度为:\log_{2}N

那可不可以更快呢?当然是可以继续优化的,如果我们一开始就将硬币分成三堆,那么使用一次天枰,问题的规模会减少成多大呢?不难分析出,问题的规模减少为了N/3,同理,我们可以算出这种方案的时间复杂度:\log _{3}N

从硬币问题这个实例可以知道,这里的减常因子规模,并不一定是规模变成一半,同样可以是1/3、1/4……也就是规模呈等比递减即可。

约瑟夫问题

讲到这里,不知道大家有没有反应过来,约瑟夫问题同样是体现减治法思想的经典问题。

我们刚才在前面总结到:如果每次处理数据能够将数据规模等比减小,这就是一种减治法。

让我们回顾一下约瑟夫问题:有N个人,从1-n编号,按编号顺序围成圈,从1号开始报数,报到m的人被淘汰。

我们模拟一下,淘汰过程(不失一般性的假设N=7,m=2):

PS:黑色数字是序号,红色数字代表被淘汰的次序(1就是第一个被淘汰) 

那么不难看出,从1开始,当遍历完一圈后,剩下人数的规模已经减为1/2,而这个1/2是由m决定的。换句话说,m决定以遍历一圈后,减治的常因子,例如m=3,则减治规模是1/3。

减可变规模算法

计算中值和选择问题

选择问题就是,求一n个数组成序列中的,第k的最小值。这个值也被称为,第k个顺序统计量。

我们先试着用无脑的方式解决它,从蛮力法的角度是比较简单的,我们就把它当作一个排序问题问题,排好序后不就可以知道第k个顺序统计量了吗。这样想当然没有问题,但是我们似乎造成了算里的浪费,大家想一想,排好序的序列,我难道只知道第k个顺序统计量嘛?我其实可以知道任何一个位置的顺序统计量,但是其他元素的位置关系我并不关心。

所以我们要做的是设计一个算法,只找第k个最小值(第k个顺序统计量),而不要浪费时间到其他元素的排序上。那么我们该怎么思考?

同样用减治法的思考方式,假设这有一个非减有序整数列,为了更加形象我们将其画出来:

那么有一个问题,如果我将第k个数之前的所有数以及之后的所有数打乱,这一操作会不会影响K的相对位置呢?当然是不会的,因为可以明确,第k个数前面的数一定小于K,同理后面的数一定大于K。那么根据这个思路,我们是不是可以在一个无序整数列选定一个数,然后以这个数为中值进行划分,小于它的在前,大于它的在后,这样就产生了一个新的序列。最后返回刚才选定中值的位置index,如果index==k的话结束,如果index<k那就在k左边重复刚才操作,如果index>k那就在k右边重复刚才操作,直到index==k。

讲到这里熟悉的同学可能已经反应过来了,这有点像快速排序,而那个划分的过程被称为Pomuto划分方法。

这个思路是完全没有问题的,然后我们来实现它(ps:这里面有一个很巧妙的操作(●'◡'●)):

#include <stdio.h>
#include <stdlib.h>

// 交换*a和*b
void swap(int* a, int* b) 
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

// 划分,a是数组首地址,low和high分别是两端的索引,要求low<=high
int PomutoPartition(int a[],int low,int high){
	int s=low;
	int p=a[low];
	int j=low+1;
	while(j<=high){
		if(a[j]<p){
			s++;
			swap(&a[s],&a[j]);
		}
		j++;
	}
	swap(&a[s],&a[low]);
	return s;
}

// 返回第k小的元素值。
// 注意:k不是下标,表示第k个
int Quickelect(int a[],int low,int high,int k){
	int s=PomutoPartition(a,low,high);
	if(s==low+k-1){
		return a[s];
	}
	else if(s>low+k-1){
		return Quickelect(a,low,s-1,k);
	}
	else{
		return Quickelect(a,s+1,high,k-(s-low+1));
	}
	
}

int main (){
	int a[20];
	int left=0;
	int right=19;
	printf("请输入20个无序整数:\n");
	for(int i=0;i<20;++i){
		scanf("%d",&a[i]);
	}
	int k=0;
	printf("你想要找第几个顺序统计量:\n");
	scanf("%d",&k);
	int rel=Quickelect(a,0,19,k);
	printf("%d\n",rel);
	return 0;
}
//9 4 8 6 7 51 52 53 58 54 32 31 39 38 36 21 25 29 24 22

我们重点讲一下Potumo划分方法:

int PomutoPartition(int a[ ],int low,int high)

// 这里将数组输入,并且用两个参数low、high限制住划分的区间

int s=low;
int p=a[low];                            // 划分时选取最左边的值作为中值p
 int j=low+1;                             // 从j=low+1开始遍历
    while(j<=high){                       // 结束条件就是遍历到最后一个元素了,j>=high
        if(a[j]<p){                             // 这一部分为了更加形象,我结合下面的图讲
            s++;
            swap(&a[s],&a[j]);
        }
        j++;
    }

 PS:(s也是>=p的)大家可以先不用疑惑怎么到这一步,我一开始其实也有点懵,这里卡了很久,但其实应该先往后推一次,就知道原理了

现在 j 要继续往后遍历,也就是 j++,如果这时候 a[ j ]<p,将 s 往后挪一个,就是图中的 s

将a[ s ]与a[ j ]交换:

这里就是我前面说的巧妙之处,是将红色箭头中>=p集合中的第一个(也就是a[ s ]),与a[ j ]交换。那么结果就是,>=p集合中的第一个(也就是a[ s ]),变成了>=p集合中的最后一个,并且这个<p的a[ j ]被加到了<p集合的最后一个。(反正我当时看的时候是被惊艳到了!!!)

最后还有一步交换(也很巧妙!!!):

swap(&a[s],&a[low]);      
return s;

 这一步操作(此时的a[ s ]是<p集合的最后一个)的结果是使此时的a[ s ]是<p集合的最后一个,移动到了<p集合的第一个,并且p变成了>=p集合的第一个。

这样一次划分就做好了,然后调用int Quickelect(int a[],int low,int high,int k)递归解决即可。

待续 

然后关于减可变规模的例子还有:插值查找、二叉查找树的查找与删除,有机会再给大家补充上去。

写在最后

总结一下,减治技术就是利用一个问题给出实例的解,与同样问题较小实例的解的关系,有了这种关系,就可以自顶向下(递归),或者自底向上(非递归)来解决。然后减治法又有三个变种:减去常数规模、减常因子规模、减可变规模。

减治法生成格雷码 【问题描述】在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。对于n=3时,可以得到000,001,011,010,110,111,101,100的格雷码,当n=4的时候可以在3的基础上利用减治法生产格雷码,产生的方法就是,从左到右最高位填0,然后在从右到左最高位填1 阅读详情

相关推荐

分治与减治算法实验:题目5 排序中减治法的程序设计

来不及了

qq_73240285的博客 1067

【算法】减治法详解

左子树上的结点都小于根节点、所有右子树都大于根节点使用中序遍历可以得到一个递增的有序序列。

weixin_45434953的博客 4862

EMC(6)——电磁场的屏蔽

假如,机箱没有开口缝隙,比如篮球这种壳体,屏蔽效能都能达到100dB,100dB,基本上把电磁场强度能衰减万倍的关系,所以,这种方式屏蔽效能非常高。一般,钣金机箱,缝隙很大,大家目视就可以看到,铝铣的机箱,比较平整,但实际情况,表面其实也是坑坑洼洼,只是,大家肉眼看不出来而已!这种安装方式,是直接在缝隙增加导电材料,存在一个问题,就是,手法温柔点,压缩度会不够,手法粗暴点,过度压缩。所以,不是说,用金属机箱就能起到屏蔽效果,重要的是,要做好机箱孔缝电磁兼容设计,否则,是金属机箱,也是摆设。

qq_39825125的博客 2181

减治法(三种类型)

本章涉及减治算法的三种类型,包含:插入排序、Johnson-Trotter算法生成排列、反射格雷码、假币问题、俄式乘法、约瑟夫斯问题、欧几里得最大公约数问题、拈游戏

weixin_62526435的博客 6920

WhatsApp网页版扫码分析

扫码登录本质上是WhatsApp的多设备登录,设备之间可以独立运行,那么当我们首次通过WhatsApp扫码登录二维码时,到底发生了那些事情?交换了那些数据?

SocialMarketing的博客 5231

架构设计之架构治理

架构治理的本质是“用规则约束复杂性,用流程保障落地,用数据驱动优化”先定目标:明确量化的治理目标,避免盲目行动;立标准:建立覆盖分层、选型、接口、拆分的统一规范,奠定治理基础;强评审:通过架构评审把控设计环节,提前规避风险;全流程:将治理规则贯穿设计、开发、测试、部署、运维全生命周期;重保障:通过组织、流程、工具确保治理落地,而非“纸上谈兵”;持续迭代:随业务与技术演进优化治理规则,避免“一劳永逸”。

xiaolyuh的专栏 812

算法设计基础——减治法

分治法是将一个大问题划分为多个子问题,接着对所有子问题求解,再将子问题的解进行合并得出原问题的解。减治法与分治法类似,也是将原问题分解为多个子问题,但却并不需要对所有子问题进行求解,它只需要求解其中一个子问题,因此不需要对子问题的解进行合并,只需通过这个子问题的解来得到原问题的解。减治法可以看做是一种特殊的分治法,但它在分解子问题的同时会不断地减少问题的规模,通常情况下其时间复杂度会比分治法低。作为入门,我们先从减一治、减半治开始来逐步了解和掌握减治法。

linzixi0220的博客 1306

MT6826SGT-STD-R绝对值编码器深度解析:精准控制+灵活编程

本文详细介绍MT品牌的高性能绝对值编码器——MT6826SGT-STD-R。:区别于传统增量式编码器,绝对值输出无需掉电归零,开机即获准确位置数据。的核心优势,结合应用场景与选型指南,为工程师提供一站式解决方案参考。MT6826SGT-STD-R是一款专为工业级精密控制设计的。该设备广泛应用于伺服系统、机器人关节校准、自动化产线等领域。:15bit分辨率实现细腻的位置反馈;:通过专用编写器可自定义多项关键参数;:优化电路设计,适应复杂电磁环境。

2501_93066786的博客 679

减治法(Decrease and Conquer)

减治法 减治法是一种一般性的算法设计技术,它利用了一个问题给定实例的解和同样问题较小实例的解之间的关系。一旦建立了这样一种关系,我们既可以自顶至下(递归)也可以自底至上地运用它(非递归)。 减治法有3种主要的变种: 减一个常量,常常是减1(例如插入排序)。减一个常因子,常常是减去因子2(例如折半查找)。减可变规模(例如欧几里得算法). 插入排序 插入排序是减(减1)治

淡然坊 1万+

vesta软件_分子动力学计算实战:利用 OVITO 软件找弗伦克尔缺陷和位错环分析

今天继续和大家分享这篇纯分子动力学(MD)的 Nat. Comm. 文章(DOI:10.1038/s41467-018-07102-3)。上期推文(从一篇 Nat. Comm. 学习经典分子动力学基本知识和相关软件基本操作 (一)),我们借用该文章的 fig.1 简单介绍了如何用文中所提到的 LAMMPS 软件来实现材料中级联碰撞过程。但是,想完整的展示类似该文章的 fig.1,单纯利用...

weixin_39524842的博客 5983

TC3XX - MCAL知识点(二十九):FLS MCAL配置及代码实战(英飞凌DFLASH)

FLS驱动程序为DFlash 0的初始化、读取、写入和擦除提供了定义良好的配置和标准服务。除此之外,我们还提供一些非autosar服务示例 Fls_17_Dmu_CompareWordsSync、Fls_17_Dmu_CancelNonEraseJobs、Fls_17_Dmu_VerifyErase,LFls_17_Dmu_VerifySectorErase、Fls_17_Dmu_GetNotifCaller等。用户通过FLS驱动程序获得对底层DFlash0的封装访问。

梦想技术家 2365

【减治法】

二叉查找树:每个节点一个元素,并使得对于每个节点来说,所有左子树的元素都小于子树根节点的元素,所有右子树的元素都大于子树根节点的元素。如果子树为空,查找失败如果不为空,则把v和该树的根K®比较相等就是找到了v< K®则在左子树中查找v> K®则在右子树中查找。

@76135327的博客 1527

2024.12.29 【RNA-seq】Rawdata数据缺失问题与解决方案

Fastq格式是一种用于存储高通量测序数据的文件格式,包含序列和相应的质量信息。第一行以开头,后接序列标识符;第二行是测序的DNA序列;第三行以开头,可能会跟随序列标识符;第四行是对应的质量值,以ASCII字符表示。Rawdata的数据完整性通常情况下是没有问题的,但我们仍然需要对下机数据进行验证,确保后续分析的正常进行,好的分析习惯可以提高整体的分析效率,避免很多不必要的麻烦。

1113

分治与减治算法实验: 排序中减治法的程序设计

减治法是一种算法设计策略,它的基本思想是将一个规模为n的问题转化为一个规模为n-1的子问题,然后利用子问题的解来求解原问题。减治法可以分为三种类型,分别是减去一个常量、减去一个常数因子和减去一个可变因子。在排序问题中,减治法有很多应用,例如插入排序、堆排序等。插入排序是一种基于减一法的排序算法,它的过程类似于扑克牌抓牌时的排序。每次从未排序的序列中取出一个元素,将其插入到已排序的序列中合适的位置,使得已排序的序列仍然有序。插入排序的时间复杂度为O(n^2),空间复杂度为O(1)。

m0_72471315的博客 1807

【AI产品与商业航图】Flux.1 完全开源 AI 绘图模型:本地部署与 ComfyUI 实战指南

Flux.1是一个开源项目,用户可以自由使用和修改,完全免除使用费用。🖥️本地部署支持:与一些依赖云端计算的工具不同,Flux.1支持本地部署,确保用户可以离线使用并自主控制数据隐私。🔄兼容ComfyUI框架:Flux.1可以无缝集成到ComfyUI中,用户可以享受更加简便和直观的操作界面。🎨卓越的图像生成能力:Flux.1能够生成高质量、细腻的图像,支持多种风格与创作主题的切换。💾低硬件要求。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1738

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

实验六 查找中减治法的程序设计

实验名称 实验六 查找中减治法的程序设计 实验目的 (1)掌握减治法的设计思想; (2)掌握折半查找和二叉查找的思想及实现过程; (3)在掌握的基础上编程实现两种查找方法的具体实现过程。 实验题目 给出一个序列及要查找的值,分别用两种查找方法实现,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。 实验源代码 折半查找: #include <stdio.h> int BinSearch(int a[],int n,int key) { int low

h1773655323的博客 852

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

减治法解决假币问题plus C++代码

减治法解决假币问题plus 以下代码是使用减治法查找假币,其中假币与真币的重量关系未知。 #include <iostream> #include <stdlib.h> using namespace std; int m=0; //真币质量 int Coin(int coin[], int n, int low, int high){ //在a[low]~a[high]中查找假币 int num1, num2, num3; //存储三组

qq_44880708的博客 1520

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

使用减治法求解堆排序

利用堆排序对一个记录进行升序算法代码: /* * 利用减治法求解堆排序 */ public class TestTwo { /** * 用于维护堆,保持最大堆的性质 * @param a 数组a * @param k 要筛的结点 */ public static void MaxHeapify(int[] a,int k,int n){ int i,j,temp...

hjl_heart的博客 2206

java减治法深度优先查找_减治法总结.ppt

减治法总结* * * * * * * * * * * * * * * * * * * * * * * * * * * 一般取子数组的第一个元素为中轴元素。 * * 对一般搜索表,也可以建立它相对应的二叉搜索树,并利用它作为数据结构进行搜索,这样的算法称为二叉搜索树搜索算法。它的优势是很明显的,它不但能够适应静态的搜索环境,也能够很好地运用到动态环境中。 但二叉查找树在最坏的情况下,n个元素的树的高...

weixin_33829335的博客 200

程序设计方法实践.软工

百丽宫小菜鸡的算法学习记录。

qq_62977717的博客 428

实验七 排序中减治法的程序设计

实验名称 实验七 排序中减治法的程序设计 实验目的 (1)掌握堆的有关概念; (2)掌握堆排序的基本思想和其算法的实现过程; (3)熟练掌握筛选算法的实现过程; (4)在掌握的基础上编程实现堆排序的具体实现过程。 实验题目 给出一个记录序列,用堆排序的方法将其进行升序排列,输出结果,输出时要求有文字说明。请任选一种语言编写程序实现上述算法,并分析其算法复杂度。 实验源代码 #include <stdio.h> void SiftHeap(int r[],int k, int n){ int

h1773655323的博客 2171

算法笔记_004:8枚硬币问题【减治法】

目录 1 问题描述 2 解决方案 2.1 减治法原理叙述 2.2 8枚硬币规模解法 2.3 n枚硬币规模解法 1 问题描述 (1)实验题目 在8枚外观相同的硬币中,有一枚是假币,并且已知假币与真币的重量不同,但不知道假币与真币相比较轻还是较重。可以通过一架天平来任意比较两组硬币,设计一个高效的算法来检...

weixin_30345577的博客 498

减治法和分治法和贪心算法和动态规划和一些算法概念

分治法是把一个问题分成多个小问题解决, 减治法是把一个问题化成一个小问题解决。 分治法的经典算法是归并排序。 归并排序:先使每个子序列有序,再合并子序列。 减治法的经典算法是约瑟夫问题。 分治法是把一个大问题划分为若干个子问题,分别求解各个子问题,然后再把子问题的解进行合并得到原问题的解。 减治法是把一个大问题划分为若干个子问题,只需求解一个子问题。 贪心算法总是做出在当前看来是最好的选择。总是局部最优选择。这种局部最优选择并不总能获得整体最优解。 动态规划是多阶段决策最优解。自底向上的方式来递推。 堆排序

Ferbc的博客 872

分治与减治算法实验:题目2 排序中分治法的程序设计

这篇文章介绍了分治法和减治法的算法设计思想,以及它们在排序问题中的应用。文章提到了许多经典的分治法和减治法的应用,例如快速排序、归并排序、堆排序等。这些排序算法都有各自的优缺点,需要根据不同的场景和需求选择合适的算法。文章还介绍了本实验的目的和内容,即通过排序中分治法的程序设计,掌握分治法和减治法在排序问题上的应用,了解不同排序算法的原理、步骤、性能和特点,能够使用高级语言实现和测试这些排序算法,并能够分析和比较它们之间的异同。

m0_72471315的博客 2101

java减治法深度优先查找_基本算法之减治法

插入排序思路:在此是将数组进行升序排序,把长度为n的数组看做有序的a[0.......n-2]和a[n-1]两部分组成,然后从右到左扫描a[0......n-2]数组,找到第一个小于或等于a[n-1]的元素,然后将a[n-1]插入到,然后把a[n-1]插入到该元素的后面,体现了分治的思想。 该算法最坏情况是一个降序排列的输入,需要经过n*n次比较,最好的情况是一个升序排列的输入,需要比较的次数为...

weixin_36210111的博客 331

快速排序的C语言实现与讲解

快速排序使用分治法(Divide and conquer)策略来把一个序列(list)分为较小和较大的2个子序列,然后递归地排序两个子序列。 步骤为: 挑选基准值:从数列中挑出一个元素,称为“基准”(pivot), 分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面(与基准值相等的数可以到任何一边)。在这个分割结束之后,对基准值的排序就已经完成, 递归排序子...

MZ21G的博客 425
上一篇: 线性表题解
下一篇: 栈和队列题解
小陈又菜
博客等级 码龄3年 680粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值