【排序&二分查找】
1.排序
-
实现归并排序、快速排序、插入排序、冒泡排序、选择排序、堆排序**(选做)(完成leetcode上的返回滑动窗口中的最大值(239),这是上一期第三天的任务进行保留(涉及队列可以对第二天进行整理复习))**
-
编程实现 O(n) 时间复杂度内找到一组数据的第 K 大元素
1.1插入排序
def insert_sort(alist):
n = len(alist)
for j in range(1,n): # j = [1,2,3, n-1]
i = j
while i>0:
if alist[i] < alist[i-1]:
alist[i], alist[i-1] = alist[i-1], alist[i]
i -= 1
else:
break
if __name__ == '__main__':
li = [54,26,93,17,77,31,44,55,20]
print(li)
insert_sort(li)
print(li)
1.2.冒泡排序
- 解法一
def bubble_sort(alist):
n = len(alist)
for j in range(n-1):
for i in range(n-1-j): #注意n-1-j 每次遍历的数都需要比上次少一个
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
- 解法二
def bubble_sort(alist):
for j in range(len(alist)-1, 0, -1): # [n-1, n-2, 1]
for i in range(j):
if alist[i] > alist[i+1]:
alist[i], alist[i+1] = alist[i+1], alist[i]
1.3.选择排序
def select_sort(alist):
n = len(alist)
for j in range(n-1):
min_index = j
for i in range(j+1, n):
if alist[min_index] > alist[i]:
min_index = i
alist[j], alist[min_index] = alist[min_index], alist[j]
if __name__ == '__main__':
li = [54,26,93,17,77,31,44,55,20]
print(li)
select_sort(li)
print(li)
1.4.快速排序
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)
2.二分查找
-
实现一个有序数组的二分查找算法
-
实现模糊二分查找算法(比如大于等于给定值的第一个元素)
def func(nums,target):
l = len(nums)
start,end = 0,l-1
while start<end:
mid = (start+end)//2
if nums[mid]==target:
return mid
elif nums[mid]<target:
start=mid+1
else:
end=mid-1
if nums[start]!= target:
return -1
return start
func([1,2,3,4,5,6,7,8,9,10,44,50,60,55,56],9)
3.对应的 LeetCode 练习题
Sqrt(x) (x 的平方根)