目录
一、Python 堆排序
二、Python 计数排序
三、Python 希尔排序
四、Python 拓扑排序
五、Python 简单的银行系统
一、Python 堆排序
(一)堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。
(二)堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。
执行以上代码输出结果为:
排序后 5 6 7 11 12 13
二、Python 计数排序
(一)计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。
(二)作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。
执行以上代码输出结果为:
符数组排序 bcmnoooruwww
三、Python 希尔排序
(一)希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。
(二)希尔排序的基本思想是:
先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序。
执行以上代码输出结果为:
排序前: 12 34 54 2 3 排序后: 2 3 12 34 54
四、Python 拓扑排序
(一)对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。
(二)简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
(三)在图论中,由一个有向无环图的顶点组成的序列,当且仅当满足下列条件时,称为该图的一个拓扑排序(英语:Topological sorting):
- 每个顶点出现且只出现一次;
- 若A在序列中排在B的前面,则在图中不存在从B到A的路径。
执行以上代码输出结果为:
拓扑排序结果: [5, 4, 2, 3, 1, 0]
五、Python 简单的银行系统
以下实例为学习 Python 银行系统的操作:
means = [0, 0, 0]
loan = 0
rate = 0
pay = 0
investment = 0
annual_rate = 0
# 计算定投预期收益
# 定投收益的计算公式为:M=a(1+x)[-1+(1+x)^n]/x;
# 其中M代表预期收益,a代表每期定投金额,x代表收益率,而n代表定投期数。
# 假设用户每月定投金额为300元,一年也就是3600元,年收益率为15%,
# 定投期限为35年,则可以计算出收益为3600(1+15%)[-1+(1+15%)^35]/15%=3648044元。
def fixed_investment(inv, a_rate, y):
global means
inv = 12 * inv
a_rate = a_rate / 100
if a_rate == 0:
expected = 0
else:
expected = inv * (1 + a_rate) * (pow((1 + a_rate), y) - 1) / a_rate
print("定投的预期收入为: %.2f" % expected)
means[1] = expected
return expected
def balance():
total = 0
for i in means:
total += i
print("你的资产总额为:%.2f" % total)
print("你的资产明细为:\n")
print("存款:%.2f" % means[0])
print("理财:%.2f" % means[1])
print("负债:%.2f" % means[2])
def saving(amount):
global means
if amount < 0:
print("存款金额不可小于 0!")
else:
means[0] += amount
print("已存款:%.2f 元" % amount)
print("当前余额:%.2f 元" % means[0])
def draw_money(drawing):
global means
if drawing < 0:
print("取款金额不可小于 0!")
elif drawing > means[0]:
print("取款金额不可超过余额!")
else:
means[0] -= drawing
print("已取款: %.2f 元" % drawing)
print("当前余额: %.2f 元" % means[0])
def loans(loan, rate, pay, years):
global means
if pay < (loan - pay) * rate:
print("你是还不完的!!!")
else:
if years == 0:
count = 0
while loan > 0:
loan -= pay
loan *= (1 + rate)
count += 1
print("将在 %d 年后还完贷款。" % count)
else:
for _ in range(years):
loan -= pay
if loan == 0:
break
else:
loan *= (1 + rate)
print("你现在的负债是: %.2f" % loan)
# means[2] = loan
return loan
# 未来财务状况
def future(years):
income = fixed_investment(investment, annual_rate, years)
debt = loans(loan, rate, pay, years)
captial = means[0] + income - debt
print("你第%i年的总资产有: %.3f" % (years, captial))
def init():
print()
print('''以下为可办理的业务:
1. 查询资产
2. 存款
3. 取款
4. 计算复利
5. 计算贷款
6. 计算未来资产
q. 退出''')
def main():
init()
while True:
choice = input("请输入您要办理的业务代码: ")
# 查询余额
if choice == "1":
balance()
# 存款
elif choice == "2":
inc = float(input("请输入存款金额: "))
saving(inc)
# 取款
elif choice == "3":
dec = float(input("请输入取款金额: "))
draw_money(dec)
# 计算定投
elif choice == "4":
investment = float(input("请输入每月定投金额: "))
annual_rate = float(input("请输入年收益率: "))
years = int(input("请输入定投期限(年): "))
if investment <= 0 or annual_rate <= 0 or years <= 0:
print("输入的数据有误")
else:
money = fixed_investment(investment, annual_rate, years)
print("最终收获: %.2f 元" % money)
# 计算贷款
elif choice == "5":
loan = float(input("请输入当前贷款: "))
rate = float(input("请输入年利率: "))
pay = float(input("请输入每年还款: "))
if loan <= 0 or rate <= 0 or pay <= 0:
print("输入的数据有误")
else:
loans(loan, rate, pay, 0)
elif choice == "6":
years = int(input("希望查询多少年后的财务状况? "))
future(years)
# 退出
elif choice == "q":
print("欢迎下次光临!再见!")
break
else:
print("你输入的指令有误,请重新输入\n")
if __name__ == '__main__':
main()