题目
Question1 2017年11月20日
Description:
给一组整数,按照升序排序,使用选择排序,冒泡排序,插入排序或者任何 O(
N2
) 的排序算法。
样例:
对于数组 [3, 2, 1, 4, 5], 排序后为:[1, 2, 3, 4, 5]。
分析
1.冒泡排序
通俗地说,数组的每个元素都是个泡泡,数字越大
,就越轻,所以3就会一层一层的往右边浮动,先和2比,轻一些,把2挤下去,再和1比,轻一些,浮上去,和4比,ok,停住,同时把使命交给4,4继续上浮,以完成一整个循环。下一次就从第二个位置开始。
def sortIntegers(self, A):
for i in range(len(A)):
j = i
for j in range(j+1,len(A)):
if A [i] > A [j]:
k = A[i]
A[i] = A[j]
A[j] = k
else:
pass
print(A)
两层循环,时间复杂度 N2
时间复杂度:O( N2 )
2.选择排序
这里同样是两层循环,每层循环选出一个剩下的元素中最小的放在数组的前面,第一次选出1,放在对首,下一循环就从队首后开始,选出2,放在队首后面,以此类推,关键就是每次循环要保存一个最小值。
def sortIntegers2(self, A):
for i in range(len(A)):
j = i
minNum = A[i]
for j in range(j+1,len(A)):
if A [j] < minNum:
k = minNum
minNum = A[j]
A[j] = k
else:
pass
A[i] = minNum
print(A)
时间复杂度:O( N2 )
3.插入排序
插入排序的理解,需要两个数组,初始数组是被排序数组和空数组,把被排序数组中的元素一个个插入空数组中,插好即排好。每次插入时只要从头遍历排好的数组找到左边小右边大的位置插进去就行了。
def sortIntegers3(self, A):
B = [A[0]]
for i in range(1,len(A)):
j = 0
for j in range(j,len(B)):
if A[i] < B[j] :
B.insert(j,A [i])
print(A[i])
break
else:
pass
B.append(A[i])
A = B
print(A)
时间复杂度:O( N2 )
总结:
这几种排序是最好写的,同时复杂度也是最高的,感觉起一个引导的效果吧,主要还是后面的复杂度更低的排序算法。