❶ 最快的排序演算法是什麼
最快的排序演算法是什麼,很多人的第一反應是快排,感覺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,並返回第一步.