标签:数组 while 大小 sim main 执行 选择 __name__ heap
选择排序是每次从序列中挑出一个最小的数字放在开始位置,依次往后即可,如何找到最小的元素可以有两种方法。
1、简单选择排序,就是直接找了,每次找到最小那个放在起始位置。
2、堆排序,在二叉树中执行,要求每个节点都比左右节点大,整个树的根节点就是最大的,然后将根节点与最后一个节点调换位置,并重新排列,这样最大值依次往后放置。
给代码。
#coding:utf-8
import random
def simpleChooseSort(numList):
lengthen = len(numList)#记录数组大小
i = 0
index = 0 #记录查询过程中的当前最大值索引
while i < lengthen - 1:
index = i
j = i + 1
while j < lengthen:
if numList[j] < numList[index]:
index = j
j += 1
if index != i:
numList[i],numList[index] = numList[index],numList[i]
i += 1
#堆排序
def heapSort(numList):
lengthen = len(numList)
start = lengthen / 2
while start >= 0:
maxHeap(numList,start,lengthen)
start -= 1
start = lengthen - 1
while start >= 2:
numList[0],numList[start] = numList[start],numList[0]
maxHeap(numList,0,start - 1)
start -= 1
if numList[0] > numList[1]: #这里比较奇怪,不知道为什么如果去掉这几句,每次排序下来总是发现根节点处发生问题。
numList[0],numList[1] = numList[1],numList[0]
if numList[0] > numList[2]:
numList[0],numList[2] = numList[2],numList[0]
if numList[1] > numList[2]:
numList[1],numList[2] = numList[2],numList[1]
#整理数组得到二叉堆
def maxHeap(numList,startIndex,lengthen):
l = 2 * startIndex + 1
r = 2 * startIndex + 2
if l < lengthen and numList[startIndex] < numList[l]:
minIndex = l
else:
minIndex = startIndex
if r < lengthen and numList[minIndex] < numList[r]:
minIndex = r
if minIndex != startIndex:
numList[startIndex],numList[minIndex] = numList[minIndex],numList[startIndex]
maxHeap(numList,minIndex,lengthen)
#测试简单选择排序
def test1():
import random
a = []
for i in range(100):
temp = random.randint(0, 100)
while True:
for x in range(len(a)):
if a[x] == temp:
temp = random.randint(0, 100)
break
else:
a.append(temp)
break
# print ‘\n‘,len(a),‘\n‘
for x in a:
print x,
simpleChooseSort(a)
print ‘\n‘
for x in a:
print x,
#测试堆排序
def test2():
import random
a = []
for i in range(100):
temp = random.randint(0, 100)
while True:
for x in range(len(a)):
if a[x] == temp:
temp = random.randint(0, 100)
break
else:
a.append(temp)
break
# print ‘\n‘,len(a), ‘\n‘
print ‘\n‘
for x in a:
print x,
heapSort(a)
print ‘\n‘
for x in a:
print x,
if __name__ == ‘__main__‘:
test1()
test2()
标签:数组 while 大小 sim main 执行 选择 __name__ heap
原文地址:http://www.cnblogs.com/world-for-gold/p/7587047.html