排序>>交換排序>>奇偶排序
List:
1 2 3 4 |
0.概念+虛擬碼+示例分析 1.奇偶排序實現 2.Question 3.後續擴充套件 |
- start
基本概念:
維基百科http://zh.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E6%8E%92%E5%BA%8F
虛擬碼:
1 2 3 |
function odd_even(A: list[1..n]){ whie has_swap: for i from 0 to n-1 |
奇偶排序
類似於氣泡排序,氣泡排序並行化的版本()
簡單但效率不高
每一輪存在兩次排序:奇數排序(下標奇數與其鄰居比較&交換),偶數排序(下標偶數與其鄰居比較交換)
直到不存在資料交換
示例:
1 |
[50, 10, 30, 20, 40, 60] |
第一輪 偶數排序
1 2 3 4 5 6 |
cmp 50 10 change [10, 50, 30, 20, 40, 60] cmp 30 20 change [10, 50, 20, 30, 40, 60] cmp 40 60 odd range [10, 50, 20, 30, 40, 60] |
第一輪 奇數排序
1 2 3 4 |
cmp 50 20 change [10, 20, 50, 30, 40, 60] cmp 30 40 even range [10, 20, 50, 30, 40, 60] |
第二輪 偶數排序
1 2 3 4 5 |
cmp 10 20 cmp 50 30 change [10, 20, 30, 50, 40, 60] cmp 40 60 odd range [10, 20, 30, 50, 40, 60] |
第二輪 奇數排序
1 2 3 4 |
cmp 20 30 cmp 50 40 change [10, 20, 30, 40, 50, 60] even range [10, 20, 30, 40, 50, 60] |
第三輪 不存在資料交換
1 2 3 4 5 6 7 8 |
cmp 10 20 cmp 30 40 cmp 50 60 odd range [10, 20, 30, 40, 50, 60] cmp 20 30 cmp 40 50 even range [10, 20, 30, 40, 50, 60] #到這裡,無資料交換,結束 [10, 20, 30, 40, 50, 60] |
- start
:::python
def oddeven_sort(l):
odd_range = range(0,len(l)-1,2)
even_range = range(1,len(l)-1,2)
sign = 1
while sign:
sign = 0
for i in odd_range:
if l[i] > l[i+1]:
l[i], l[i+1] = l[i+1],l[i]
sign = 1
for j in even_range:
if l[j] > l[j+1]:
l[j], l[j+1] = l[j+1], l[j]
sign = 1
print l - start
A.奇偶排序概念,過程描述?
B. 時間複雜度?空間複雜度?是否是穩定排序?
- start
後續擴充套件——Batcher奇偶歸併排序(後面實現)
打賞支援我寫出更多好文章,謝謝!
打賞作者
打賞支援我寫出更多好文章,謝謝!
任選一種支付方式