数据结构与算法 代码整理:常见的选择排序法

选择排序法

1 # 选择排序法
2 def SelectSort(s):
3     n = len(s)
4     for i in range(n-1):
5         min = i
6         for j in range(i+1,n):
7             if s[j]<s[min]: min = j
8         s[min], s[i] = s[i], s[min]

 

树形选择排序法(锦标赛排序)

 1 # 树形选择排序法(锦标赛排序)
 2 def TreeSelectionSort(s,inf=999):
 3     result = []
 4     turns = n = len(s)
 5     if len(s)%2 == 1:
 6         s.append(inf); n += 1                               # 为了计算方便,在奇数数组后面补一个极大的数
 7     lastwinner = range(n)
 8     newwinner = []
 9 
10     for turn in range(turns):
11         lastwinner = range(n)
12         nn = len(lastwinner)
13         while nn>=2:                                        # 当存在两个以上的竞争者时,继续比赛(经过处理,nn必为偶数)
14             nn /= 2
15             for i in range(nn):
16                 newwinner.append( lastwinner[2*i]
17                         if s[lastwinner[2*i]] < s[lastwinner[2*i+1]] 
18                         else lastwinner[2*i+1] )
19             nn = len(newwinner)
20             if nn==1:   break
21             elif nn%2==1:   newwinner.append(-1); nn += 1    # 将s最后的极大数序号补回去,使nn为偶数
22             lastwinner[:] = newwinner[:]                    # 保存当前胜利者编号,进行下次迭代
23             newwinner = []
24         result.append(s[newwinner[0]])                      # 将本轮获胜者提出
25         s[newwinner[0]] = inf                               # 删除本轮获胜者(这里用无穷大代替之)
26     return result

 

堆排序

 1 # 堆排序
 2 
 3 # 堆调整函数
 4 # 大根堆与小根堆分别对应从小到大排序和从大到小排序
 5 # 以从小到大为例,先在原数组上建立最大堆,然后将堆顶元素和当前堆末元素交换
 6 # 这时最大的元素已经移到数组末尾,这时令n-=1,即从堆中删除掉堆末元素,
 7 # 对前面的n-1个元素进行堆调整,重复上面的操作,将第二大的元素换到最后
 8 # 经过n-1次对换和调整后,所有结点有序,排序结束
 9 
10 # 输入 s:待调整数组, i:子树根节点位置,n:树的结点个数(适应堆排序适应)
11 def sift(s,i,n = None):   # 调整子树为大根堆
12     if n is None:  n = len(s)
13     while i*2+1 < n:    # 当左子树存在时
14         if s[i]<s[2*i+1]:   # 先讨论左子树
15             t = 2*i+1
16         else: t = i
17         if i*2+2 < n and s[t] < s[i*2+2]:   # 再讨论右子树
18             t = 2*i+2
19         if t!=i:
20             s[i],s[t] = s[t],s[i]
21             i = t       # 更新i为刚才与它交换的儿子结点的编号,以便接下来继续向下调整    
22         else:   
23             break       # 说明当前父结点已经比两个子结点要大,结束调整
24 
25 def HeapSort(s):
26     n = len(s)
27     for i in range(n/2-1,-1,-1):    # 初始化堆
28         sift(s,i)
29     for i in range(n-1,1,-1):   # 从数组末尾到数组第1个元素,第0个元素不用交换
30         s[i],s[0] = s[0],s[i]   # 将堆顶元素调换
31         sift(s,0,i-1)           # 由于根左右必定为堆,所以自对0号结点调整,同时待排序元素数量-1

 

posted on 2015-08-12 15:49  hanahimi  阅读(398)  评论(0编辑  收藏  举报

导航