python实现几种常用的排序算法

一、冒泡排序

# 冒泡排序:每次循环比较相邻的两个元素
def maopao_sort(nums):
	for i in range(n - 1):
    	for j in range(n - 1 - i):
        	if nums[j] > nums[j + 1]:
            	nums[j], nums[j + 1] = nums[j + 1], nums[j]

二、选择排序

# 选择排序:每次循环把当前循环中最小的元素移动到正确位置
# 方式一:每次循环都移动
def select_sort1(nums):
	for i in range(n):
    	for j in range(i + 1, n):
        	if nums[i] > nums[j]:
            	nums[i], nums[j] = nums[j], nums[i]


# 方式二:记录本次循环中最小元素的index,再移动
def select_sort2(nums):
	for i in range(n):
    	mix_index = i
    	for j in range(i + 1, n):
        	if nums[mix_index] > nums[j]:
            	mix_index = j
    	nums[i], nums[mix_index] = nums[mix_index], nums[i]

三、插入排序

# 插入排序:类似玩扑克牌抓牌然后插入到正确位置的动作
# 1、正向遍历乱序的list(列表的后半部分)
# 2、反向遍历有序的list(列表的前半部分)
# 3、如果当前遍历的乱序列表中的元素比有序列表的最大元素还小,就找位置插入
def insert_sort(nums):
	for i in range(1, n):
    	if nums[i] < nums[i - 1]:
        	current = nums[i]  # 当前待插入元素
        	for j in range(i - 1, -1, -1):
            	if nums[j] >= current:
                	nums[j + 1] = nums[j]  # 向后移动一位
                	nums[j] = current  # 把当前待插入元素 current 插入进去

四、shell 排序

# shell 排序:和插入排序类似,只是插入排序的 step 固定为 1,而希尔排序的 step 会变化至 1,比插入排序更高效
def shell_sort(nums):
    step = len(nums)//2
    while step > 0:
        for i in range(step, len(nums)):
            while i >= step and nums[i] < nums[i-step]:
                nums[i], nums[i-step] = nums[i-step], nums[i]
                i -= step
        step //= 2

五、快速排序

def quick_sort(nums: list):
    if len(nums) <= 1:
        return nums
    mid = nums.pop(len(nums) // 2)
    # left = []
    # right = []
    # for num in nums:
    #     if num <= mid:
    #         left.append(num)
    #     else:
    #         right.append(num)
    
    # 如果不使用上述的 for 循环,可以用 filter
    left = list(filter(lambda item: item <= mid, nums))
    right = list(filter(lambda item: item > mid, nums))
    return quick_sort(left) + [mid] + quick_sort(right)

六、归并排序

def merge_sort(nums):
    if len(nums) == 1:
        return nums
    mid_index = len(nums) // 2
    left = merge_sort(nums[:mid_index])
    right = merge_sort(nums[mid_index:])
    return merge(left, right)


def merge(left, right):
    result = []
    while left and right:
        result.append(left.pop(0) if left[0] <= right[0] else right.pop(0))
    result.extend(left or right)
    return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值