1.1 冒泡排序
class BubbleSort:
"""
冒泡排序
时间复杂度:最坏 O(n*n)、平均 O(n*n)、最优 O(n)
空间复杂度:O(1)
简介:
1 循环一次列表,对每相邻两个元素做比较,决定是否交换
2 一次循环后,有序区个数+1,无序区个数-1
3 再对无序区重复步骤1
"""
def sort(self, li):
"""
冒泡排序
:param li:
:return:
"""
n = len(li)
for n_ in range(n - 1):
change_flag = False
for i in range(n - n_ - 1):
if li[i] > li[i + 1]:
li[i], li[i + 1] = li[i + 1], li[i]
change_flag = True
if not change_flag:
break
return li
1.2 选择排序
class SelectSort:
"""
选择排序
时间复杂度:最坏 O(n*n)、平均 O(n*n)、最优 O(n*n)
空间复杂度:O(1)
简介:
1 设列表第一个元素为有序区,后面元素为无序区
2 遍历一遍无序区,找到无序区中比有序区最后一个元素更小的元素,并交换
3 对无序区重复步骤1,有序区个数+1,无序区个数-1
"""
def sort(self, li):
"""
选择排序
:param li:
:return:
"""
n = len(li)
for n_ in range(n - 1):
min_loc = n_
for i in range(n_ + 1, n):
if li[i] < li[min_loc]:
min_loc = i
li[n_], li[min_loc] = li[min_loc], li[n_]
return li
1.3 插入排序
class InsertSort:
"""
插入排序
时间复杂度:最坏 O(n*n)、平均 O(n*n)、最优 O(n*n)
空间复杂度:O(1)
简介:
1 设列表第一个元素为有序区,后面元素为无序区
2 从无序区(右)选择一个元素,插入当前有序区(左)的正确位置
3 重复步骤2,有序区个数+1,无序区个数-1
"""
def sort(self, li):
"""
插入排序实现方式1
:param li:
:return:
"""
n = len(li)
for right in range(1, n):
curr = li[right]
for left in range(right - 1, -1, -1):
if li[left] > curr:
li[left + 1] = li[left]
else:
li[left + 1] = curr
break
else:
li[right % 1] = curr
return li
def sort_2(self, li):
"""
插入排序实现方式2
:param li:
:return:
"""
n = len(li)
for right in range(1, n):
curr = li[right]
left = right - 1
while left >= 0 and li[left] > curr:
li[left + 1] = li[left]
left -= 1
li[left + 1] = curr
return li