您的位置:首页 > 理论基础 > 数据结构算法

数据结构&算法实践—【排序|交换排序】奇偶排序

2012-05-17 22:36 627 查看
转载请注明出处: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奇偶归并排序(后面实现)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: