Python 算法题

Python 算法题

1. 算法题

"""
算法题:
    提供一个序列,完成对这个序列的分割。要求分割后的两个序列彼此差值最小
    实现函数,返回两个序列
"""
count = 0

def func(i):
    i.sort()
    global count 
    count += 1
    print('i', i)
    print('count', count)
    if not i:
        return ([], [])
    elif len(i) == 1:
        return (i[0:], [])
    else:
        max_num = i[-1]
        min_num = i[-2]

    max_list, min_list = func(i[:-2])
    max_list.append(min_num)
    min_list.append(max_num)
    print('max_list', max_list)
    print('min_list', min_list)

    if sum(max_list) >= sum(min_list):
        return (max_list, min_list)
    else:
        return (min_list, max_list)


l = [1, 46, 3, 8, 6, 4561, 4642, 45, 8, 9, 155, 1784]
# l = [1, 46, 3, 9, 6, 10]
print(len(l))
l1, l2 = func(l)
print(l1, l2)
# [3, 6, 9, 45, 1784, 4561] [1, 8, 8, 46, 155, 4642]

2. 快速排序

def quick_sort(alist, start, end):
# 递归的退出条件
	if start >= end:
		return
	# 设定起始元素为要寻找位置的基准元素
	mid = alist[start]
	# low 为序列左边的由左向右移动的游标
	low = start
	# high 为序列右边的由右向左移动的游标
	high = end
	while low < high:
	# 如果 low 与 high 未重合,high 指向的元素不比基准元素小,则 high 向左移动
		while low < high and alist[high] >= mid:
			high -= 1
	# 将 high 指向的元素放到 low 的位置上
		alist[low] = alist[high]
	# 如果 low 与 high 未重合,low 指向的元素比基准元素小,则 low 向右移动
		while low < high and alist[low] < mid:
			low += 1
	# 将 low 指向的元素放到 high 的位置上
		alist[high] = alist[low]
	# 退出循环后,low 与 high 重合,此时所指位置为基准元素的正确位置
	# 将基准元素放到该位置
	alist[low] = mid
	# 对基准元素左边的子序列进行快速排序
	quick_sort(alist, start, low-1)
	# 对基准元素右边的子序列进行快速排序
	quick_sort(alist, low+1, end)
alist =[54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(alist,0,len(alist)-1)
print(alist)

3. 冒泡排序


arr = [7, 4, 3, 67, 34, 1, 8]

def bubble_sort(arr):
    n = len(arr)
    for j in range(0, n - 1):
        count = 0
        for i in range(0, n - 1 - j):
            if arr[i] > arr[i + 1]:
                arr[i], arr[i + 1] = arr[i + 1], arr[i]
                count += 1
        if count == 0:
            return
        print(count)

bubble_sort(arr)
print(arr) 

arr1 = [1, 3, 4, 7, 8, 34, 67]
bubble_sort(arr1)
print(arr1) 

4. 选择排序

在这里插入代码片

5. 希尔排序

在这里插入代码片

6. 堆排序

在这里插入代码片

7. 基数排序

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值