小黑算法成长日记1:递归选择排序,全排列,二分查找

1.递归选择排序

# 递归选择排序
def selectSort(arr,i):
    if i == len(arr)-1:    #递归出口
        return
    else:    #子问题处理
        Min = arr[i]
        temp = i
        for j in range(i+1,len(arr)):
            if arr[j]< Min:    #计算子问题最小值
                Min = arr[j]
                temp = j
        if temp != i:
            arr[temp],arr[i] = arr[i],arr[temp]
        selectSort(arr,i+1)    #抛给下一个子问题
#调用方法
arr = [2,3,1,7,1,3,4]
selectSort(arr,0)
print('递归选择排序后结果:',arr)
#结果:
"""
递归选择排序后结果: [1, 1, 2, 3, 3, 4, 7]
"""

2.全排列问题(固定位置放元素法)

# 固定位置放元素
def perm1(arr,m):
    if m == len(arr)-1:
        print(arr)
    else:
        for i in range(m,len(arr)):
            arr[m],arr[i] = arr[i],arr[m]
            perm1(arr,m+1)
            arr[m],arr[i] = arr[i],arr[m]
arr = [i for i in range(3)]
perm1(arr,0)
#结果:
"""
[0, 1, 2]
[0, 2, 1]
[1, 0, 2]
[1, 2, 0]
[2, 1, 0]
[2, 0, 1]
"""

3.全排列问题(固定元素放位置法)

# 固定元素放位置
arr = [4,5,6]
index = [-1]*len(arr)
def perm2(index,m):
    if m == len(index):    #定义递归出口,当被排列元素索引越界时打印当前排列结果
        print([arr[i] for i in index])
    else:    #抛出子问题:将索引为m的元素进行插空列举
        for i in range(0,len(index)):
            if index[i] == -1:
                index[i] = m
                perm2(index,m+1)
                index[i] = -1    #将当前插入位置的索引清楚,准备将其插到下一个位置
perm2(index,0)
#结果:
"""
[4, 5, 6]
[4, 6, 5]
[5, 4, 6]
[6, 4, 5]
[5, 6, 4]
[6, 5, 4]
"""

4.二分查找

#二分查找
def binarySearch(arr,left,right,x):
    while left <= right:
        mid = int((left+right)/2)    #中间值的索引
        if arr[mid] == x:
            return mid
        elif arr[mid] > x:
            right = mid - 1
        else:
            left = mid + 1
    return -1
arr = [2,5,12,56,100,788,1234]
print(binarySearch(arr,0,len(arr),12))
print([binarySearch(arr,0,len(arr),x) for x in arr])
#结果:
"""
2
[0, 1, 2, 3, 4, 5, 6]
"""
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值