冒泡排序
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))