2.1.13紙牌排序。說說你會如何將一副撲克牌按花色排序(花色順序是黑桃、紅桃、梅花和方片),限制條件是所有牌都是背面朝上排成一列,而你一次只能翻看兩張牌或者交換兩張牌(保持背面朝上)。
演算法具體描述如下:
1)翻看第一張、第二張牌
2)如果第二張牌的花色小於第一張牌的花色,那麼交換這兩張牌
3)翻看第一張、第三張牌
4)如果第三張牌的花色小於第一張牌的花色,那麼交換這兩張牌,如此反覆直到翻看第一張牌和第52張牌
5)翻看第二張牌和第三張牌,第三張花色小於第二張時交換這兩張牌,接著翻看第二張和第四張牌,如此反覆直到翻看第二張牌和最後一張牌
6)如此反覆直到翻看第39張和第40張牌,如果第40張花色小於第39張,那麼交換這兩張牌。此時所有花色已完成排序。(13張x3種花色=39張,這39張已有序,剩下的13張就是同一種花色了)
演算法可再改進部分:
為減少翻看的次數,又由於只有4種牌色,那麼翻看兩張牌時,如果第一張翻看牌的花色是餘下牌的最小花色,那麼不需要反覆翻看這張牌和其後的所有牌,直接翻看其後的兩張牌。餘下牌的最小花色的快整判斷規則是:
令52張牌的52個位置為1至52,由鴿巢原理得出
當翻看的第一張牌的位置是1至13時,最小花色是黑桃。
當翻看的第一張牌的位置是14至26時,最小花色是紅桃。
當翻看的第一張牌的位置是27至39時,最小花色是梅花。
當翻看的第一張牌的位置是40至52時,最小花色是方片
Algs4 1 5 17隨機連線
1.5.17隨機連線。設計uf的乙個用例 erdosrenyi,從命令列接受乙個整數n,在0到n 1之間產生隨機整數對,呼叫connected 判斷它們是否相連,如果不是則呼叫union 方法 和我們的開發用例一樣 不斷迴圈直到所有觸點均相互連通並列印出生成的連線總數。將你的程式打包成乙個接受引數n...
Algs4 1 3 31隨機連線
1.3.31隨機連線。編寫一段程式,從命令列接受乙個整數n和double值p 0到1之間 作為引數,在乙個圓上畫出大小為0.05且間距相等的n個點,然後將每對點按照概率p用灰線連線。public class test for int i 0 i points.length i for int j 0...
Algs4 1 4 20雙調查找
1.4.20雙調查找。如果乙個陣列中的所有元素是先遞增後遞減的,則稱這個陣列為雙調的。編寫乙個程式,給定乙個含有n個不同int值的雙調陣列,判斷它是否含有給定的整數。程式在最壞情況下所需的比較次數為 3lgn。答 第一步找出陣列中的最大值索引,然後將陣列從最大值索引位置一分為二,將陣列分為單調遞增和...