❶ 最快的排序算法是什么
最快的排序算法是什么,很多人的第一反应是快排,感觉QuickSort 当然应该最快了,其实并非如此,快排是不稳定的,最坏情况下,快排序并不是最优,Java7 中引入的 TimSort 就是一个结合了插入排序和归并排序的高效算法.
Timsort最早是 Tim Peters 于2001年为 python 写的排序算法。自从发明该算法以来,它已被用作Python,Java,Android平台和GNU Octave中的默认排序算法。
关于此算法的详细描述参见 http://svn.python.org/projects/python/trunk/Objects/listsort.txt
看看它与另外两个高效排序算法的比较
相比之下, TimSort 的最佳,平均和最坏情况综合起来最佳。在数据量比较少(<=64)的情况下,它直接用 Insert Sort,否则使用 MergeSort + BinarySearch 来提高排序效率
下面写一个给扑克牌排序的例子,比较一下冒泡,插入,快排,归并排序,TimSort的性能:
然后分别用以上5种排序方法来做下性能比较
将1000 副牌打乱顺序的扑克牌排序下来,结果如下
但是 TimSort 也有一个问题, 在 JDK7 的描述中提到它有如下兼容性问题
所以在JDK7以后,实现Comparable接口的比较器需要满足以下三个约束条件:
1) 自反性:x,y 的比较结果和 y,x 的比较结果相反。
2) 传递性:x>y, y>z,则 x>z。
3) 对称性:x=y,则 x,z 比较结果和 y,z 比较结果相同。
如果你的比较方法违反了以上的约束,要么你不使用这个新的算法,还是回到传统的归并排序
要么修改你的比较器以符合上述的约束条件。
举两个例子如下
❷ 请设计一个计算两个正整数a,b(a>b)的最小公倍数的算法!
ab/(a,b)
(a,b)表示两个数最大公约数,
其中最大拆亩肢公约耐激数可以用辗转相除法求得:
int GCD(int m1,int n1){
int t,temp;
if(m1<n1)
{
temp=m1;
m1=n1;
n1=temp;
}
while(n1!=0)
{
t=m1%n1;
m1=n1;
n1=t;
}
return n1;
}
GCD表示旅世最大公约数的函数.
❸ 设计一个计算两个正整数A和B的最小公倍数的算法
int function min_multiple(int x,int y)
{
int r;
r=x;
while (r%y!=0)
{
r+=x;
}
return r;
}
或function min_multiple(x,y)
dim r
r = x
while not (r MOD y = 0 )
r = r + x
wend
min_multiple = r
end function
就是说 两个数 x和y 先假设 x就是两者的最小公倍数,用它来除以y,如果没有余数,能整除,那它确实就是最小公倍数了.
如果不能整除的话,就把x变成2x,再除以y,如果能整除,当然,是最小公倍数.
以此类推,用3x 4x 5x一直除以y.毕竟两者的最小公倍数一定是x的整数倍,也就山禅是验证所有的x的整数倍(从小到大)是不是y的倍数,当找到第一逗弊尘个能够整除y的,也就是卜行它们的最小公倍数.
❹ 求程序大侠:写一算法,将带头结点的有序单链表A和B合并成一个新的有序表C。
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
status mergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
{LinkLIst *ha,*hb,*hc;
ha=La->next;hb=Lb->next;
Lc=(LinkList*)malloc(LinkList);hc=Lc;
while(ha!=NULL)
{hc->next=(LinkList*)malloc(LinkList);
hc->next->data=ha->data;
ha=ha->核搭next;hc=hc->虚备next;
}
while(hb!=NULL)
{hc->next=(LinkList*)malloc(LinkList);
hc->next->data=hb->data;
hb=hb->next;hc=hc->差氏毁next;
}
hc->next=NULL;
}
❺ 请问这个猜数字游戏怎么玩,几A几B的!
先解释标准规则,再介绍几种变体。
通常由两个人玩,一方出数字,一方猜。出数字的人要想好一个没有重复数字的4个数,不能让猜的人知道。猜的人就可以开始猜。每猜一个数字,出数者就要根据这个数字给出几A几饥拍B,其中A前面的数字表示位置正确的数的个数,而B前的数字表示数字正确而位置不对的数的个数。
如正确答案为 5234,而猜的人猜 5346,则是 1A2B,其中有一个5的位置对了,记为1A,而3和4这两个数字对了,而位置没对,因此记为 2B,合起来就是 1A2B。
接着猜的人再根据出题者的几A几B继续猜,直到猜中(即 4A0B)为止。
猜数字游戏通常设有猜测次数的上限。根据计算机测算,如果采用严谨的猜测策略,任何数字最多7次就可猜出(即达到 4A0B)。值得注意的是,敬胡在有些地方把次数上限定义为最多几次猜测以后就可以肯定数字是几,但这时或还需要再猜一次才能得到 4A0B 的结果。
标准的猜数字游戏由10个数码(0-9)和4个数位组成。可以通过变化数码或数位来丰富游戏。例如,可以使用9个数码玩4个数位的游戏。
猜数字游戏的一种变体允许重复的数码。这种规则的游戏被称为 Mastermind。其规则大致为:
除了上面的规则外,如果有出现重复的数字,则重复的数字每个也只能算一次,且以最优的结果为准。例如,如正确答案为5543,猜的人猜5255,则在这里不能认为猜测的第一个5对正确答案第二个,根据最优结果为准的原理和每个数字只能有一次的规则,两个比较后应该为1A1B,第一个5位子正确,记为1A;
猜测数字中的第三个5或第四个5和答案的第二个5匹配,只能记为1B。当然,如果有猜5267中的第一个5不能与答案中的第二个5匹配,因此只能记作1A0B。
(5)百万英雄a和b的最快的算法扩展阅读:
猜数字游戏最常用的解法,其算法步骤如下:
a、首先猜 1234,得到第一个反馈(xAyB)。
b、从所有数字烂稿羡中,筛选出满足已知反馈的所有可能数字,称之为“可能集”。
c、对于所有数字(而不仅限于筛选出来的可能集),逐一评估每个数字的“好坏”,并给其打分。选取得分最高的那个数字猜。如果有多个数字的评分一样高,则优先选取可能集中的数字。
d、重复步骤 b-c,直到猜出 4A0B 为止。
❻ 年龄和属相最快的算法,年龄的计算及属相
提起年龄和属相最快的算法,大家都知道,有人问如何根据年龄推算属相,另外,还有人想问知道属相怎么算年龄,你知道这是怎么回事?其实已知年龄跟属相如何快速的计算出属于哪个纳音五行,下面就一起来看看年龄的计算及属相,希望能够帮助到大家!
显然你应该属蛇,生肖是农历范畴,但有一种特殊情况,如果没到腊月三十,但又在立春后出生地,就应属下一年的生肖。你出生时,还没过大寒(.1.20)呢,显然你属蛇。
用十二生肖怎么计算年龄
计算公式:设当年生肖为a年,生肖为b,最小年猜亏龄为N。
当a≥b时,N=(a-b)+1
例如:今年为马(7)年,某人属虎(3),其最小年龄N=(7-3)+1=5,年龄可能为5、17、29、41……
当a<b时,N=(a-b)+1+12
例如:今年为虎(3)年,某人属马(7),其最小年龄N=(3-7)+1+12=9,年龄可能为9、21、33、45…….
本年是自己的生肖年叫本命年。比如今年是龙年,等等就是本命年。本命年和本年的年数相加减,就能算出自己的年龄。比如今年16岁,牛。本命年在3年前或9年后,13+3或25-9都等于16。
中国先民感受到寒暑交替,植物枯荣的周期,以之为“一岁”。月亮的盈亏周期也与“岁”相关——十二次月圆正好一岁。用木星作为年的周期,“岁星”绕行一圈刚好十二年。《周礼·春官·冯相氏》云:“掌十有二岁、十有二月、十有二辰”,除计年计月,十旅兆腔二也用做计量时辰。
十二也经常用于其他方面。《左传·哀公七年》中载,“周之王也,制札上物,不过十二。以为天之大数也。”《国语·晋语四》记,“黄帝之子二十五宗,其得姓者十四人,为十二姓”。《后汉书·苟爽传》云:“故娶十二妇,天之数也。诸侯以下各有等差。”
这么算:
今年是鼠年
那么年也是鼠年
同样的道理,都是鼠年.
这是类推法,其间的差距就是生肖的循环数12.
那么对应的,就是今年是0岁24岁48岁
60岁的人是属鼠的,这里说的年龄是周岁
那么就以60岁为对比.61岁是属猪,62岁是属狗,63岁是属鸡
怎样根据十二生肖快速计算相应的年龄?////////?????????????????????????????????????????
怎么通过生肖计算出年龄?
首先需要熟练记忆各生肖所代表的数字:鼠1,牛2,虎3,兔4,龙5,蛇6,马7,羊8,猴9,鸡10,狗11,猪12,单轮内排名越前年龄越大。
例如今年年是猪年,那么年龄最小的猪就是1岁,最小的狗就是2岁,最小的鸡就是3岁……(以此类推)最小的鼠就是13岁。
而同数猪不同的年龄段为每一轮加12岁。例如今年年是猪年,那么年龄最小的猪就是1岁,下一轮就为13岁,再下一轮就为25岁,往下的以此类推。
十二生肖是十二地支的形象化代表,即子(鼠)、丑(牛)、寅(虎)、卯(兔)、辰(龙)、巳(蛇)、午(马)、未(羊)、拆衫申(猴)、酉(鸡)、戌(狗)、亥(猪),随着历史的发展逐渐融合到相生相克的观念,表现在婚姻、人生、年运等,每一种生肖都有丰富的;
并以此形成一种观念阐释系统,成为文化中的形象哲学,如婚配上的属相、会祈祷、本命年等。现代,更多人把生肖作为春节的吉祥物,成为娱乐文化活动的象征。
生肖作为悠久的民俗文化号,历代留下了大量描绘生肖形象和象征意义的诗歌、春联、绘画、书画和工艺作品。除中国外,世界多国在春节期间发行生肖邮票,以此来表达对中国新年的祝福。
以上就是与年龄的计算及属相相关内容,是关于如何根据年龄推算属相的分享。看完年龄和属相最快的算法后,希望这对大家有所帮助!
❼ 快速排序算法原理与实现
快速排序的基本思想就是从一个数组中任意挑选一个元素(通常来说会选择最左边的元素)作为中轴元素,将剩下的元素以中轴元素作为比较的标准,将小于等于中轴元素的放到中轴元素的左边,将大于中轴元素的放到中轴元素的右边。
然后以当前中轴元素的位置为界,将左半部分子数组和右半部分子数组看成两个新的数组,重复上述操作,直到子数组的元素个数小于等于1(因为一个元素的数组必定是有序的)。
以下的代码中会常常使用交换数组中两个元素值的Swap方法,其代码如下
publicstaticvoidSwap(int[] A, inti, intj){
inttmp;
tmp = A[i];
A[i] = A[j];
A[j] = tmp;
(7)百万英雄a和b的最快的算法扩展阅读:
快速排序算法 的基本思想是:将所要进行排序的数分为左右两个部分,其中一部分的所有数据都比另外一 部分的数据小,然后将所分得的两部分数据进行同样的划分,重复执行以上的划分操作,直 到所有要进行排序的数据变为有序为止。
定义两个变量low和high,将low、high分别设置为要进行排序的序列的起始元素和最后一个元素的下标。第一次,low和high的取值分别为0和n-1,接下来的每次取值由划分得到的序列起始元素和最后一个元素的下标来决定。
定义一个变量key,接下来以key的取值为基准将数组A划分为左右两个部分,通 常,key值为要进行排序序列的第一个元素值。第一次的取值为A[0],以后毎次取值由要划 分序列的起始元素决定。
从high所指向的数组元素开始向左扫描,扫描的同时将下标为high的数组元素依次与划分基准值key进行比较操作,直到high不大于low或找到第一个小于基准值key的数组元素,然后将该值赋值给low所指向的数组元素,同时将low右移一个位置。
如果low依然小于high,那么由low所指向的数组元素开始向右扫描,扫描的同时将下标为low的数组元素值依次与划分的基准值key进行比较操作,直到low不小于high或找到第一个大于基准值key的数组元素,然后将该值赋给high所指向的数组元素,同时将high左移一个位置。
重复步骤(3) (4),直到low的植不小于high为止,这时成功划分后得到的左右两部分分别为A[low……pos-1]和A[pos+1……high],其中,pos下标所对应的数组元素的值就是进行划分的基准值key,所以在划分结束时还要将下标为pos的数组元素赋值 为 key。
❽ 欧几里德算法
The Euclidean Algorithm
欧几里德算法(又称辗转相除法)是一种用于快速寻找两个整数的最大公约数的技巧。
最大公约数 Greatest Common Divisor (GCD):整数 A 和 B 的最大公约数是指能够同时整除 A 和 B 的最大整数。
使用欧几里德算法寻找 GCD(A,B) 的过程如下:
欧几里德算法使用了下述特性:
如果 A 和 B 其中一个为 0,便可利用前两个特性得出 GCD。 第三个特性帮助我们将大而复杂的问题化简为小而容易解决的问题。 欧几里德算法先利用第三个特性迅速化简问题,直至可以通过前两个特性求解为止。
证明 GCD(A,0)=A 的过程如下:
GCD(0,B)=B 的证明过程与此类似,区别仅在于用 B 替换 A。
先证明较简单的 GCD(A,B)=GCD(B,A-B),再证明 GCD(A,B)=GCD(B,R)
根据定义 GCD(A,B) 可均分 A。因此,A 一定是 GCD(A,B) 的倍数,即 X⋅GCD(A,B)=A ,此处的 X 是某个整数。 根据定义 GCD(A,B) 可均分 B。因此,B 一定是 GCD(A,B) 的倍数,即 Y⋅GCD(A,B)=B ,此处的 Y 是某个整数。
根据 A-B=C 可得出:
由此可见 GCD(A,B) 可均分 C。 上图的左侧部分展示了此证明,提取如下:
证明 GCD(B,C) 均分 A
根据定义 GCD(B,C) 可均分 B。因此,B 一定是 GCD(B,C) 的倍数,即 M⋅GCD(B,C)=B ,此处的 M 是某个整数。 根据定义 GCD(B,C) 可均分 C。因此,C 一定是 GCD(B,C) 的倍数,即 N⋅GCD(B,C)=B ,此处的 N 是某个整数。
根据 A-B=C 可得出:
B+C=A
M⋅GCD(B,C) + N⋅GCD(B,C) = A
(M + N)⋅GCD(B,C) = A
由此可见 GCD(B,C) 可均分 A。 下图展示了此证明:
证明 GCD(A,B)=GCD(A,A-B)
根据定 GCD(A,B) 均分 B
同时,已证明 GCD(A,B) 均分 C
因此,GCD(A,B) 是 B 和 C 的公约数
由于 GCD(B,C) 是 B 和 C 的最大公约数,所以 GCD(A,B) 必须小于或等于 GCD(B,C)。
根据定义 GCD(B,C) 均分 B
同时,已证明 GCD(B,C) 均分 A
因此,GCD(B,C) 是 B 和 A 的公约数
由于 GCD(A,B) 是 A 和 B 的最大公约数,所以 GCD(B,C) 必须小于或等于 GCD(A,B)。
∵ GCD(A,B)≤GCD(B,C) 且 GCD(B,C)≤GCD(A,B) ∴ GCD(A,B)=GCD(B,C) 即 GCD(A,B)=GCD(B,A-B)
下图的右侧部分展示了此证明的图示:
前面已证明了 GCD(A,B)=GCD(B,A-B) 另外,对于 GCD( ) 而言,括号中各项的顺序并不重要,因此 GCD(A,B)=GCD(A-B,B) 那么,如果反复应用 GCD(A,B)=GCD(A-B,B),便可得到: GCD(A,B)=GCD(A-B,B)=GCD(A-2B,B)=GCD(A-3B,B)=...=GCD(A-Q⋅B,B) 由于 A= B⋅Q + R 可得 A-Q⋅B=R,所以 GCD(A,B)=GCD(R,B) 。 由于括号中各项的顺序并不重要,因此最终可得: GCD(A,B)=GCD(B,R)
找寻 270 和 192 的最大公约数:
A=270, B=192
A=192, B=78
A=78, B=36
A=36, B=6
A=6, B=0
从上面的过程可以看出: ∵ GCD(270,192) = GCD(192,78) = GCD(78,36) = GCD(36,6) = GCD(6,0) = 6 ∴ GCD(270,192) = 6
❾ 哪种排序算法对【1,3,2,4,5,6,7,8,9】进行的排序最快,请详细说明
升序结果的话,冒泡,没槐只需要两趟就完了。
已经给出的数列是接近有序的,猜棚第一趟把3和2调序后,第二趟发现没有交换,就知道已经有序了枯兆友。
快速的话,还是按照普通的方式来操作,需要进行划分遍历,比较次数还是挺多的
归并和快速差不多,都需要进行划分操作
堆排序需要构建堆,需要全部执行完才知道是否有序。
❿ 用自然语言描述:求两个正整数a和b最大公约数的算法
辗转相除法:设两数为a、b(b<a),求它们最大公约数(a、b)的步骤如下:用b除a,得a=bq.r 1(0≤r).若r1=0,则(a,b)=b;若r1≠0,则再用r1除b,得b=r1q.r2 (0≤r2).若r2=0,则(a,b)=r1,若r2≠0,则继续用r2除r1,……如此下去,直到能整除为止.其最后一个非零余数即为(a,b).
————————————--------------------------------------------
辗转相除法是利用以下性质来确定两个正整数 a 和 b 的最大公因子的:1.若 r 是 a ÷ b 的余数,则 gcd(a,b) = gcd(b,r) 2.a 和其倍数之最大公因子为 a.另一种写法是:1.a ÷ b,令r为所得余数(0≤r<b) 若 r = 0,算法结束;b 即为答案.2.互换:置 a←b,b←r,并返回第一步.