本文将介绍十大排序中比较常用的排序方法,所有排序均由python实现
选择排序
选择排序是在每一轮中选择数组中现存最大/最小的数字,取出来,放在首位。
选择排序是不稳定的
时间复杂度:O(n2)
空间复杂度:O(1)
代码实现
def select_sort(nums):
for i in range(len(nums)):
min_idx = i
# 找到最小的数字
for j in range(i+1, len(nums)):
if nums[min_idx] > nums[j]:
min_idx = j
#放到开头
nums[i], nums[min_idx] = nums[min_idx], nums[i]
冒泡排序
不断的对比相邻的数字,交换位置,让最大/最小的数字沉底
冒泡排序是稳定的
时间复杂度:O(n2)
空间复杂度:O(1)
代码实现
def bubble_sort(nums):
n = len(nums)
for c in range(n):
for i in range(1, n - c):
if nums[i - 1] > nums[i]:
nums[i - 1], nums[i] = nums[i], nums[i - 1]
return nums
插入排序
遍历每一个元素,把这个元素插入到前面已经排序好的数组里
插入排序是稳定的
时间复杂度:O(n2)
空间复杂度:O(1)
代码实现
def insert_sort(nums):
n = len(nums)
for i in range(1, n):
while i > 0 and nums[i - 1] > nums[i]: # 找插入位置
nums[i - 1], nums[i] = nums[i], nums[i - 1]
i -= 1
return nums
快速排序
快速排序需要选取一个哨兵pivot,还有left和right两个指针,然后把数组中比pivot小的放左边,比privot大的放右边。
left和right先设为数组最左边的和最右边的数
def quick_sort(nums):
n = len(nums)
def quick(left, right):
if left >= right: # 结束递归
return nums
pivot = left # 设定基准
i = left
j = right
while i < j:
while i < j and nums[j] > nums[pivot]:#右边大于哨兵时继续移动,直到找到比哨兵小的
j -= 1
while i < j and nums[i] <= nums[pivot]:
i += 1
nums[i], nums[j] = nums[j], nums[i]#交换位置
nums[pivot], nums[j] = nums[j], nums[pivot]#左右坐标重合,把哨兵放到该位置
#分别对两边的数组继续排序
quick(left, j - 1)
quick(j + 1, right)
return nums
return quick(0, n - 1)
(持续更新中。。。。陆续添加其他排序算法)