算法
Cathy _Mmm
这个作者很懒,什么都没留下…
展开
-
C++基数排序
基数排序也是分配排序:以下面的这个数组作为例子以上面的例子来说,要将他排序的话,首先基数排序的思想,可以按照数值的个位数的大小先排一次序,并且按照顺序将数据给记录下来,然后再将数值的十位拍一次序,在前一次的基础上此时的个已经是有序的,将十位再排一次序的话则数组的数的十位之后个位与十位的数值都是有序的,以此类推,一直排下去就能将是整个数值有序由于这个排序是按照数值的个位或是十位的排序,所以要知道,最大值的最大位数是多少,还要知道,某数值的某位数为多少求最大值的最大位数代码:int getmax原创 2020-11-21 23:28:53 · 667 阅读 · 0 评论 -
C++直接排序
直接排序也叫分区交换排序直接排序的思想:即在一个文件中选择一个值,则以这个值为中间值,比它大的放右边,小的放左边,此时可以找出所以比它大的值在右边,比他小的值在左边,此时再将比这个中间值小的再次排序一次 ,大的排序一次,显然有递归的思想在里面快速排序中要知道起始位置与终止位置,上面所说的之间值可以文件中的任意值,在这里还是设为起始位置直到中间值之后就要开始比较大小由于中间值设置为起始位置,所以可以从终止位置开始比较,终止位置在后面,所以一定大于中间值,如果大于则比较终止位置的前一个直到小于中间值时,原创 2020-11-19 00:26:21 · 1662 阅读 · 5 评论 -
C++冒泡排序
冒泡排序也是一种较为简单的交换排序:冒泡排序的思想:在一组长度为len的数组中,冒泡排序总共会排n-1遍,而一遍都会找出当前数组的最大值或是最小值下面为第一遍的过程,此时就是要找到当前数组的最大值,那么就要开始将下标为0与下标为1的值相比较,在本案例中为升序排序,所以判断arr[i]>arr[i+1]时,则说明arr[i]大,则要交换两者的值,交换之后大的值在下一个位置,再将这个值较大与它的下一位比较,这样比较到最后一个值时,就可以找到当前的最大值在第一遍遍历完之后,找到了最大的原创 2020-11-16 23:00:52 · 132 阅读 · 2 评论 -
C++希尔排序
希尔排序的思想较为巧妙,它的思想:将要排序的文件分为n个组,距离为s的分为一组,再将这一组进行排序,完成这个操作之后,再将s的值变小继续排序直到距离为零时下图进行第一次排序:首先要知道一个距离的值,这个值可以设为数组长度的一半(超过的话第一次排序不能将所有的数值都排序一次),在本案例中为4,初始值可以设为从下标为4的元素开始,这样正好可以使这个数组从下标为0的位置比较,元素都可以进行排序一遍第一遍时,距离较大,每组所记录数较少,所以速度较快。后面的几次排序时,距离就会缩小,缩小的原则为除以2,在第二次原创 2020-11-09 23:55:54 · 317 阅读 · 0 评论 -
C++折半插入排序
折半插入排序思想:在排序第i个数时,前i-1个数已经排序完成,这是折中排序的前提,所以在开始排序时起始位置为i=1折中排序,顾名思义就是折中,所以在折中排序时,先要以谁开头以谁结尾,所以需要定义两个变量front,end,有了这两个变量才能够找到他们的中间值mid排序的最终目的还是找到i的最终插入位置,本代码要求升序排序,所以只需找到比下标为i的数小的数的下标以此时只需将mid的值与i的值作比较,如果arr[i]<arr[mid]的话,此时说明下标为i的插入位置为[0,mid-原创 2020-11-07 00:03:55 · 1924 阅读 · 2 评论 -
C++直接插入排序
直接插入排序在排序中较为简单:在上面数组中,长度为5,而直接插入排序的思想就是:在第一遍的时候,第i-1个到前面的都为有序的数组(所以i的位置应该从下标1开始)而此时的第i个元素就是要排序,由于前i-1个元素是有序的,所以只需要找比i的元素大的或者小的下标就像上图中的当i=1时此时要找到比arr[i]小的数,如果是比它大的话,那么将这个这个与他比较的数组向后移动,再次与前一个数组比较但是向前移动的这个动作不能一直下去,停下来的条件是i不能小于等于0代码如下:DirectInsertSo原创 2020-11-06 00:07:53 · 2433 阅读 · 4 评论 -
BF算法(Java)
BF算法(Java)算法思想:算法思想:从主串的第一个字符开始与模式串的第一个字符开始比较如果相同,主串与字串都开始比较下一个如果不相同模式串返回到最初的位置,主串返回到主串的位置减去模式串位置加一的位置依次类推,直到在主串中找到与模式串匹配的字符串。package String;public class Brute_Force { public static void ...原创 2020-03-12 19:31:13 · 314 阅读 · 0 评论 -
算法:数组中相加为0的三元组
给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。注意:三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c)解集中不能包含重复的三元组。 本问题有多种解法,此处用ArrayList的方法 1. 首先要判断数组num是否为空 2. 将数组排序,(排序有多种方法) 3. 遍历数组,分析题目可知,三个数相加等于零,此时的数组num已经是排过序的,由小到大的顺序,所以第一个数字如果大于0的话,那么后面的数一定都大于0,所以此处可以加一原创 2020-09-06 17:08:11 · 1398 阅读 · 0 评论 -
算法:数组中出现一次的数字
数组中出现一次的数字一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。本题有多种解法,此处用hashMap的方法,方法步骤如下: 1. HashMap中的键存储数组array的数字,值存储array中的数值出现的个数 2. 遍历HashMap,找到Value值等于1的键,并将其储存在新数组temp中 3. 将数组temp里面的值赋值给num1,num2.其代码如下import java.util.Map;import java.util.HashMa原创 2020-09-06 14:04:39 · 1659 阅读 · 0 评论 -
KMP算法(Java)
简介 KMP算法是一种字符串匹配算法,相对于BF算法,KMP算法的效率更高,当BF算法中失配时,主串与模式串都会回溯,效率较低。KMP算法匹配失配时,只需要将模式串回溯到适当的位置。next数组当失配时,模式串会回溯到一定的位置,回溯的位置取决于next数组。next数组的代码public static int[] getNext(String p){ int[] ...原创 2020-03-15 14:39:59 · 462 阅读 · 0 评论 -
纸牌游戏
纸牌游戏问题:编号为1-52张牌,正面向上,从第2张开始,以2为基数,是2的倍数的牌翻一次,直到最后一张牌;然后,从第3张开始,以3为基数,是3的倍数的牌翻一次,直到最后一张牌;然后…从第4张开始,以4为基数,是4的倍数的牌翻一次,直到最后一张牌;…再依次5的倍数的牌翻一次,6的,7的直到以52为基数的翻过,输出:这时正面向上的牌有哪些?public class test02 { pu...原创 2020-03-11 19:57:39 · 1094 阅读 · 0 评论