經典演算法題每日演練 第二十二題 奇偶排序

2021-09-09 01:22:16 字數 1736 閱讀 2418

原文:

經典演算法題每日演練——第二十二題 奇偶排序

這個專題因為各種原因好久沒有繼續下去了,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趟排序後,我們的陣列就排序完畢了,從圖中②可以看到,如果每個執行緒分攤乙個奇數字,那交換是不是只要

一次就夠了呢,可以看到這個演算法在多核處理下面還是很有優勢的。

最後的執行**:

1

using

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 遞...