原文:
經典演算法題每日演練——第二十二題 奇偶排序
這個專題因為各種原因好久沒有繼續下去了,mm吧。。。***,嘿嘿,不過還得繼續寫下去,好長時間不寫,有些東西有點生疏了,
這篇就從簡單一點的乙個「奇偶排序」說起吧,不過這個排序還是蠻有意思的,嚴格來說複雜度是o(n2),不過在多核的情況下,可以做到
n2 /(m/2)的效率,這裡的m就是待排序的個數,當m=100,複雜度為n2 /50,還行把,比冒泡要好點,因為重點是解決問題的奇思妙想。
下面我們看看這個演算法是怎麼描述的,既然是奇偶,肯定跟位數有關了
1:先將待排序陣列的所有奇數字與自己身後相鄰的偶數字相比較,如果前者大於後者,則進行交換,直到這一趟結束。
2:然後將偶數字與自己身後相鄰的奇數字相比較,如果前者大於後者,則進行交換,直到這一趟結束。
3:重複1,2的步驟,直到發現無「奇偶」,「偶奇」 交換的時候,就認為排序完畢,此時退出迴圈。
① 待排序陣列: 9 2 1 6 0 7
② 所有奇數字與身後的相鄰的偶數字比較交換 2 9 1 6 0 7
③ 所有偶數字與身後的相鄰的奇數字比較交換 2 1 9 0 6 7
④ 所有奇數字與身後的相鄰的偶數字比較交換 1 2 0 9 6 7
⑤ 所有偶數字與身後的相鄰的奇數字比較交換 1 0 2 6 9 7
⑥ 所有奇數字與身後的相鄰的偶數字比較交換 0 1 2 6 7 9
我們可以看到,經過5趟排序後,我們的陣列就排序完畢了,從圖中②可以看到,如果每個執行緒分攤乙個奇數字,那交換是不是只要
一次就夠了呢,可以看到這個演算法在多核處理下面還是很有優勢的。
最後的執行**:
1using
system;
2using
system.collections.generic;
3using
system.linq;
4using
system.text;
5using
system.xml.xsl;67
namespace8;
1415 console.writeline("
\n排序前 =>
" + string.join(","
, list));
1617 list =oddevensort(list);
1819 console.writeline("
\n排序後 =>
" + string.join(","
, list));
2021
console.read();22}
2324
static list oddevensort(listlist)
2547}48
49//
再進行 奇數字 排序
第二十二題
第二十二題 韓信點兵 在中國數學史上,廣泛流傳著乙個 韓信點兵 的故事 韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點名的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數 按從1到5報數,記下最末乙個士兵報的數為1 按從1...
每日一題 第二十二題
第二十二題 韓信點兵 在中國數學史上,廣泛流傳著乙個 韓信點兵 的故事 韓信是漢高祖劉邦手下的大將,他英勇善戰,智謀超群,為漢朝建立了卓越的功勞。據說韓信的數學水平也非常高超,他在點名的時候,為了知道有多少兵,同時又能保住軍事機密,便讓士兵排隊報數 按從1到5報數,記下最末乙個士兵報的數為1 按從1...
leecode第二十二題(括號生成)
檢測條件2 最後乙個一定是右括號 is real false if is real 打入result result.push back new item void baoli int retain vlaue,int num all,int n,vector result,vector temp 遞...