转载请注明出处:http://blog.csdn.net/wklken
回主目录
排序>>交换排序>>奇偶排序
List:
0.概念+伪代码+示例分析
1.奇偶排序实现
2.Question
3.后续扩展
o start
基本概念:
维基百科http://zh.wikipedia.org/wiki/%E5%A5%87%E5%81%B6%E6%8E%92%E5%BA%8F
伪代码:
function odd_even(A: list[1..n]){
whie has_swap:
for i from 0 to n-1 && i%2==0 && i+1<=n-1{
if(A[i] > A[i+1])
swap(A[i], A[i+1])
}
for j from 1 to n-1 && j%2==1 && j+1<=n-1{
if(A[j] > A[j+1])
swap(A[j], A[j+1])
}
}
奇偶排序
类似于冒泡排序,冒泡排序并行化的版本()
简单但效率不高
每一轮存在两次排序:奇数排序(下标奇数与其邻居比较&交换),偶数排序(下标偶数与其邻居比较交换)
直到不存在数据交换
示例:
[50, 10, 30, 20, 40, 60]
第一轮 偶数排序
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]
第一轮 奇数排序
cmp 50 20
change [10, 20, 50, 30, 40, 60]
cmp 30 40
even range [10, 20, 50, 30, 40, 60]
第二轮 偶数排序
cmp 10 20
cmp 50 30
change [10, 20, 30, 50, 40, 60]
cmp 40 60
odd range [10, 20, 30, 50, 40, 60]
第二轮 奇数排序
cmp 20 30
cmp 50 40
change [10, 20, 30, 40, 50, 60]
even range [10, 20, 30, 40, 50, 60]
第三轮 不存在数据交换
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]
1. start
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
2 start
A.奇偶排序概念,过程描述?
B. 时间复杂度?空间复杂度?是否是稳定排序?
3 start
后续扩展——Batcher奇偶归并排序(后面实现)