目录:
- 常用查找方法
- 列表排序常用方法介绍
- 性能最差的三个排序(冒泡,选择,插入)
- 快排:快速排序中最简单的(递归调用)
- 堆排序
- 归并排序(递归调用)
- 快速排序,堆排序, 归并排序 比较
- 时间复杂度、空间复杂度和稳定性
1.1 常用查找方法
算法刷题网站: https://leetcode-cn.com/problemset/all/
1、递归
- 自己调用自己
- 有结束条件
2、二分查找
l = list(range(1,101))
def bin_search(data_set,val):
low = 0
high = len(data_set) - 1
while low <= high:
mid = (low+high)//2
if data_set[mid] == val:
return mid
elif data_set[mid] < val:
low = mid + 1
else:
high = mid - 1
return
n = bin_search(l,11)
print(n) # 返回结果是: 10
1.2 列表排序常用方法介绍
1、常用排序方法
1、 性能最差的三个排序
1) 冒泡排序
2) 选择排序
3) 插入排序
2、 快速排序
3、 排序NB二人组
1) 堆排序
2) 归并排序
2、时间复杂度
- 循环减半的过程复杂度 O(logn)
- 几次循环就是n的几次方的复杂度
3、排序方法比较
1.3 性能最差的三个排序
1、冒泡排序代码(最好是O(n), 最坏O(n2))
- 原理:拿自己与上面一个比较,如果上面一个比自己小就将自己和上面一个调换位置,依次再与上面一个比较,第一轮结束后最上面那个一定是最大的数
冒泡排序:
import random
def bubble_sort(li):
for i in range(len(li) - 1):
exchange = False
for j in range(len(li) - i -1): #内层for循环执行一次,选出一个最大值,将可以调换位置的数调整
if li[j] > li[j + 1]:
li[j],li[j+1] = li[j+1],li[j]
exchange = True
if not exchange: # 如果上一趟没有发生交换就证明已经排序完成
break
data = list(range(100))
random.shuffle(data) #将有序列表打乱
bubble_sort(data)
print(data)
冒泡排序精简版:
#! /usr/bin/env pythonf
# -*- coding: utf-8 -*-
def bubble_sort(li):
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j] > li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
li = [1,5,2,6,3,7,4,8,9,0]
bubble_sort(li)
print(li) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2、选择排序
- 先假定第一个是最小的,依次与其他数比,如果其他数中有比第一个数小就假定这个更小的最小
- 再比,第一轮就可以找到最小的那个放到0号位置,然后在假定1号位置数最小与剩下比较,再找到第二小的数放到第1号位置
选择排序:
import random
def select_sort(li):
for i in range(len(li) - 1):
min_loc = i #开始先假设0号位置的值最小
for j in range(i+1, len(li)): #循环无序区,依次比较,小于min_loc就暂定他的下标最小
if li[j] < li[min_loc]: #所以内层for循环每执行一次就选出一个小值
min_loc = j
li[i], li[min_loc] = li[min_loc],li[i]
data = list(range(100))
random.shuffle(data) #将有序列表打乱
select_sort(data)
print