数据结构与算法 代码整理:常见的选择排序法
选择排序法
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