今天主要整理了时间复杂度为O(n**2)
的几个排序代码, 虽然这几个不经常使用, 但是对初学者训练自己的思维还是有帮助的. 希望能对大家有所帮助
1.冒泡排序
- 时间复杂度:
O(n**2)
- 空间复杂度:
O(1)
- 排序稳定性: 稳定
# coding:utf-8
def bubble_1(nums):
"""
把最小的向前移动
:param nums:
:return:
"""
length = len(nums)
for i in range(length):
for j in range(i + 1, length):
if nums[i] > nums[j]:
nums[i], nums[j] = nums[j], nums[i]
print(nums)
def bubble_2(nums):
"""
把最大的向后移动
:param nums:
:return:
"""
stop = True # 一个信号, 如果数组原本就是有序的, 则是O(n)
length = len(nums)
for i in range(length):
for j in range(length - i - 1):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
stop = False
if stop:
break
print(nums)
if __name__ == "__main__":
nums_1 = [4, 5, 2, 6, 1, 8]
bubble_1(nums_1)
print("----")
nums_2 = [4, 5, 2, 6, 1, 8]
bubble_2(nums_2)
2.插入排序
是一个动态的排序过程, 即动态的往有序集合中添加数据, 最终保持集合有序
思路: 把数组分为两个区间, 已排序区间
和待排序区间
. 初始已排序区间就是数组的第一个元素, 之后遍历待排序区间所有元素, 依次插入已排序区间的正确位置
- 时间复杂度:
O(n**2)
- 空间复杂度:
O(1)
- 是否稳定: 稳定. 对于值一样的元素, 后出现的在后面
# coding:utf-8
def insert_sort(nums):
length = len(nums)
for i in range(1, length):
key = nums[i]
j = i - 1
while j >= 0:
if nums[j] > key:
nums[j + 1] = nums[j]
else:
break
j -= 1
nums[j + 1] = key
print(nums)
if __name__ == "__main__":
nums = [4, 5, 2, 6, 1, 8]
insert_sort(nums)
3.选择排序
和插入排序类似, 都会区分已排序区间和待排序区间, 区别是选择排序每次会拿出待排序区间中最小的元素追加到已排序区间
- 空间复杂度:
O(1)
- 时间复杂度:
O(n**2)
- 是否稳定: 不稳定. 对于相等的元素会出现 后出现的排序完成后出现在前面
# coding:utf-8
def select_sort(nums):
length = len(nums)
for i in range(length):
min_num = float("inf")
for j in range(i, length):
if nums[j] < min_num:
min_num = nums[j]
min_position = j
nums[i], nums[min_position] = nums[min_position], nums[i]
print(nums)
if __name__ == "__main__":
nums = [4, 5, 2, 6, 1, 8]
select_sort(nums)
后面我会再整理出其它常用的排序算法, 欢迎大家继续关注