完整code放在我的github上
括号中为平均时间复杂度
1. 冒泡排序(O(n2)O(n2))
第一个数和剩下的依次比较,大的下沉(升序),第二个数和剩下的依次比较,。。。,依次类推
def bubble_sort(a):
for i in range(len(a) - 1): ##最后一个数不用比较
for j in range(len(a) - i - 1):
if a[j] > a[j+1]:
a[j], a[j+1] = a[j+1], a[j]
print(a)
return a
a=[8,3,2,7,5,1,6]
print(bubble_sort(a))
Output:
[3, 8, 2, 7, 5, 1, 6] [3, 2, 8, 7, 5, 1, 6] [3, 2, 7, 8, 5, 1, 6] [3, 2, 7, 5, 8, 1, 6] [3, 2, 7, 5, 1, 8, 6] [3, 2, 7, 5, 1, 6, 8] [2, 3, 7, 5, 1, 6, 8] [2, 3, 5, 7, 1, 6, 8] [2, 3, 5, 1, 7, 6, 8] [2, 3, 5, 1, 6, 7, 8] [2, 3, 1, 5, 6, 7, 8] [2, 1, 3, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8]
2. 直接选择排序(O(n2)O(n2))
每次从待排序序列中选出最小值放到待排序序列之首
def selection_sort(a):
for i in range(len(a)-1):
j = a.index(min(a[i:]))
if j != i:
a[i], a[j] = a[j], a[i]
print(a)
return a
a=[8,3,2,7,5,1,6]
print(selection_sort(a))
Output:
[1, 3, 2, 7, 5, 8, 6] [1, 2, 3, 7, 5, 8, 6] [1, 2, 3, 5, 7, 8, 6] [1, 2, 3, 5, 6, 8, 7] [1, 2, 3, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8]
3. 直接插入排序(O(n2)O(n2))¶
列表被分为有序区和无序区两个部分。最初有序区只有一个元素。 每次从无序区选择一个元素,插入到有序区的位置,直到无序区变空。
def insert_sort(a):
for i in range(1,len(a)):
insert_num = a[i]
j = i - 1
while j >= 0 and insert_num < a[j]:
a[j+1] = a[j]
j -= 1
a[j+1] = insert_num
print(a)
return a
a = [8,3,2,7,5,1,6]
insert_sort(a)
Output:
[3, 8, 2, 7, 5, 1, 6] [2, 3, 8, 7, 5, 1, 6] [2, 3, 7, 8, 5, 1, 6] [2, 3, 5, 7, 8, 1, 6] [1, 2, 3, 5, 7, 8, 6] [1, 2, 3, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8]
4.快速排序(O(nlogn)O(nlogn))
先从待排序的数组中找出一个数作为基准数(取第一个数即可),然后将原来的数组划分成两部分:小于基准数的左子数组和大于等于基准数的右子数组。然后对这两个子数组再递归重复上述过程,直到两个子数组的所有数都分别有序。最后返回“左子数组” + “基准数” + “右子数组”,即是最终排序好的数组。
def quick_sort(a):
if len(a)<=1:
return a
else:
list_left=[];list_right=[];list_p=[]
for i in a:
if i > a[-1]:
list_right.append(i)
elif i<a[-1]:
list_left.append(i)
else:
list_p.append(i)
list_left = quick_sort(list_left)
list_right = quick_sort(list_right)
list=list_left+list_p+list_right
print(list)
return list
a=[8,3,2,7,5,1,6]
print(quick_sort(a))
Output:
[2, 3] [2, 3, 5] [1, 2, 3, 5] [7, 8] [1, 2, 3, 5, 6, 7, 8] [1, 2, 3, 5, 6, 7, 8]