算法Day1

冒泡排序

def bubble_sort(our_list):
    n = len(our_list)
    for i in range(n):
        for j in range(0,n-1):   # 索引 后边有j+1
            if our_list[j] > our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
    return our_list

our_list = [2,6,4,8,1,9,15,35,21,53]
print(bubble_sort(our_list))

优化点:
• 1、添加有序标记(flag),当没有元素交换时跳出循环
• 2、记录有序/无序边界,已有序的元素不需要再被进行比较,因此每轮需比较的数
列长度会减少

def bubble_sort(our_list):
    n = len(our_list)
    lastExchageIndex = 0   # 记录最后一次交换元素的位置
    sortBorder  = n - 1    # 无序数列边界
    for i in range(n):
        flag = True         # 有序标记,每轮开始初始值均为True
        for j in range(0,sortBorder):   # 索引 后边有j+1
            if our_list[j] > our_list[j+1]:
                our_list[j],our_list[j+1] = our_list[j+1],our_list[j]
                flag = False    #有元素交换,则将标记为False
                lastExchageIndex = j
        sortBorder = lastExchageIndex
        if flag: # 每轮排序完成
            break
    return our_list

our_list = [2,6,4,8,1,9,15,35,21,53]
print(bubble_sort(our_list))

选择排序算法

# 选择排序
def select_sort(arr):
    n = len(arr)
    count = 0  # 统计更改次数
    for i in range(n-1): # 对比n-1次
        mark = i
        for j in range(i+1,n):  # i后面的数字
            if arr[j] < arr[mark]: # 如果发现后面存在比最小值档还小的数
                mark = j   # 这里暂时不更改位置,等循环结束后再更改

        if mark != i: # 判断当前的最小值是不是i所在位置
            arr[i],arr[mark] = arr[mark],arr[i]
            count += 1
    print("交换次数",count)
    return arr

arr = [3, 5, 6, 1, 2]
print(select_sort(arr))

优化
同时找出最小值与最大值放在数列两侧,两边逐渐逼近,循环次数会减少一些

def select_sort_op(arr):
    n = len(arr)
    for i in range(n // 2):
        min_mark = i # 第一个位置
        max_mark = n -i- 1 # 最后一个位置
        for j in range(i + 1, n -i):  # i后面的数字到n -i
            if arr[j] < arr[min_mark]:  # 如果发现后面存在比最小值还小的数
                min_mark = j

        if min_mark != i:  # 判断当前的最小值是不是i所在位置
            arr[i], arr[min_mark] = arr[min_mark], arr[i]

        for j in range(n-i-2,i,-1): # 倒序查找最大值
            if arr[j] > arr[max_mark]:
                max_mark = j

        if max_mark != (n -i- 1):
            arr[i], arr[max_mark] = arr[max_mark], arr[i]

    return arr

题目:给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整
数,并返回他们的数组下标
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

def two_sum(nums,target):
    dict1 = {}
    for i ,num in enumerate(nums):
        print(i,num)
        if target-num in dict1:  # 遍历到15时,查找到2在字典
            return [dict1[target-num],i]
        else:
            dict1[num] = i
    print(dict1)

nums = [2,7,11,15]
target = 17
print(two_sum(nums, target))

题目:pow(x,n)
二分求幂法

def myPow(x, n):
    if n == 0:
        return 1
    if n < 0:
        x = 1 / x
        n = -n
    ans = 1
    while n:
        if n % 2:
            ans *= x
        n >>= 1
        x *= x
    return ans

print(myPow(2.0, 3))
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值