每个python排序函数都是在整数的一个列表上进行操作的,并且都会用一个swap函数来交换列表中两项的位置。
def swap(lyst, i ,j):
temp = lyst[i]
lyst[i] = lyst[j]
lyst[j] = temp
exchange the items at the positions i and j.
选择排序
排序最简单的策略就是搜索整个列表,找到最小项的位置。如果不在列表的第一位,算法就交换此项和第一项的位置。然后,算法回到第二个位置并且重复这个过程。当算法到达最后一项时,列表就是排序好的了。这个算法就叫做selection sort。
def ss(lyst):
i = 0
while i < len(lyst) - 1:
minIndex = i
j = i + 1
while j < len(lyst):
if lyst[j] < lyst[minIbdex]:
minIndex = j
j += 1
if minIndex != i:
swap(lyst, minIndex, i)
i += 1
嵌套循环,i,j表示position。例:i=0. j=1
j小于list长度时,从列表第二项先与第一项(minIndex)比较大小,最小项与下一项比较,直到最后一项
然后从第二项重新开始循环。
冒泡排序
从列表开头处开始,并且比较一对数据项,直到移动到列表的末尾。每当成对的两项之间的顺序不正确的时候,算法就交换其位置。这个过程可以将最大项以冒泡的方式排到最后一项。然后,算法从第二项重复,直到该算法从最后一项开始执行,此时,列表是排序好了的。
def bs(lyst):
n = len(lyst):
while n > 1:
i = 1
while i < n:
if lyst[i] < lyst[i-1]:
swap(lyst, i , i-1)
i += 1
n -= 1
插入排序
策略:
- 在第 i 轮通过列表的时候,第 i 个项应该插入到列表的前 i 个项之中的正确位置。
- 在第 i 轮之后,前 i 个项应该是排好序的。
- 类似我们排列手中的扑克牌,我们按顺序放好了抓到的 i-1 张牌,那么抓取的第 i 张牌,与手中的这些牌比较,直到找到合适的位置
- 插入排序包含两个循环。外围的循环遍历从1到 n-1 的位置。对于这个循环中的每一个位置 i ,我们都保存该项并且从位置 i-1 开始内部循环。对于这个循环中的每一个位置 j, 我们都将项移动到位置 j+1,直到找到了给保存的项(第 i 项)的插入位置。
def is(lyst):
i = 1
while i < len(lyst):
itemtoinsert = lyst[i]
j = i - 1
while j >= 0:
if itemtoinsert < lyst[j]:
lyst[j+1] = lyst[j]
j -= 1
else:
break
lyst[j+1] = itemtoinsert
i += 1
以上三种方法都可以实现排序,但是效率都不高。在最坏情况和平均情况下,性能都是O(n2).