如何写代码:
01.提炼问题 要明确需求
02.分析问题 -->动脑子 产出:思路报告 即我是怎么想到的
03.落实到代码
04.实例测试 看看能否满足需求 如果不能那么请debug
05.时间和空间复杂度
目的:
算法的入门篇 10种排序算法和3种查找算法
参考:
《数据结构和算法 python语言描述》
查找:
01.线性查找
def seq_find(array,target):
found = False
for ele in array:
if ele == target:
found = True
return found
02.二分查找
def binary_search(array,target)
found = False
start = 0
end = len(array) -1
while first <= last and not found:
middle = (start+end) //2
if array[middle] == target:
found = True
else:
if array[middle] > target:
end = middle -1
else:
start = middle + 1
return found
03.hash查找
hash查找知道时间复杂度是1就可以了吧?常用的hash取余的算法 还是解决冲突的算法 没必要了
排序:01-04是简单的排序 05-07是复杂排序 08-10是线性排序
01.插入排序
提炼问题:很明确,要求我们通过插入的方式实现排序,重点在插入
分析问题:首先第一个元素是有序的,那么只需要将后续的元素插入到合适的位置即可;
后续元素如何处理呢?比如pos=k的元素 只需要将该元素的值提炼出来 依次和前边的元素pos-1进行比较,直至pos>0或者lst[pos-1]< value of k
代码:
def insert_sort(lst):
for index in range(1,len(lst)):
pos = index
val = lst[index]
while pos >0 and val < lst[pos-1]:
lst[pos] = lst[pos-1]
pos = pos -1
lst[pos] = val
测试:
array = [25,67,54,33,20,78,65,49,17,56,44]
insert_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
02.冒泡排序
提炼问题:像冒泡一样 相邻元素两两比较 直至最大的到最后
分析问题:以N个元素的列表为例,需要进行N-1次冒泡,第一次冒泡需要N-1次比较 第二次冒泡需要比较N-2次 第N-1次需要比较1次
代码:
def bubble_sort(lst):
pass_num = len(lst)-1
for num in range(pass_num,0,-1):
for i in range(num):
if lst[i] > lst[i+1]:
lst[i],lst[i+1] = lst[i+1],lst[i]
测试:
array = [25,67,54,33,20,78,65,49,17,56,44]
bubble_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
03.选择排序
提炼问题:重在选择
分析:假设index=0的元素值最大,遍历一遍 选出最大的放到末尾 如此遍历N次
代码:
def insert_sort(lst):
for index in range(1, len(lst)):
pos = index
val = lst[index]
while pos > 0 and val < lst[pos - 1]:
lst[pos] = lst[pos - 1]
pos = pos - 1
lst[pos] = val
测试:
array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44]
insert_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
04.
如何写代码:
01.提炼问题 要明确需求
02.分析问题 -->动脑子 产出:思路报告 即我是怎么想到的
03.落实到代码
04.实例测试 看看能否满足需求 如果不能那么请debug
05.时间和空间复杂度
目的:
算法的入门篇 10种排序算法和3种查找算法
参考:
《数据结构和算法 python语言描述》
查找:
01.线性查找
def seq_find(array,target):
found = False
for ele in array:
if ele == target:
found = True
return found
02.二分查找
def binary_search(array,target)
found = False
start = 0
end = len(array) -1
while first <= last and not found:
middle = (start+end) //2
if array[middle] == target:
found = True
else:
if array[middle] > target:
end = middle -1
else:
start = middle + 1
return found
03.hash查找
hash查找知道时间复杂度是1就可以了吧?常用的hash取余的算法 还是解决冲突的算法 没必要了
排序:01-04是简单的排序 05-07是复杂排序 08-10是线性排序
01.插入排序
提炼问题:很明确,要求我们通过插入的方式实现排序,重点在插入
分析问题:首先第一个元素是有序的,那么只需要将后续的元素插入到合适的位置即可;
后续元素如何处理呢?比如pos=k的元素 只需要将该元素的值提炼出来 依次和前边的元素pos-1进行比较,直至pos>0或者lst[pos-1]< value of k
代码:
def insert_sort(lst):
for index in range(1,len(lst)):
pos = index
val = lst[index]
while pos >0 and val < lst[pos-1]:
lst[pos] = lst[pos-1]
pos = pos -1
lst[pos] = val
测试:
array = [25,67,54,33,20,78,65,49,17,56,44]
insert_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
02.冒泡排序
提炼问题:像冒泡一样 相邻元素两两比较 直至最大的到最后
分析问题:以N个元素的列表为例,需要进行N-1次冒泡,第一次冒泡需要N-1次比较 第二次冒泡需要比较N-2次 第N-1次需要比较1次
代码:
def bubble_sort(lst):
pass_num = len(lst)-1
for num in range(pass_num,0,-1):
for i in range(num):
if lst[i] > lst[i+1]:
lst[i],lst[i+1] = lst[i+1],lst[i]
测试:
array = [25,67,54,33,20,78,65,49,17,56,44]
bubble_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
03.选择排序
提炼问题:重在选择
分析:假设index=0的元素值最大,遍历一遍 选出最大的放到末尾 如此遍历N次
代码:
def insert_sort(lst):
for index in range(1, len(lst)):
pos = index
val = lst[index]
while pos > 0 and val < lst[pos - 1]:
lst[pos] = lst[pos - 1]
pos = pos - 1
lst[pos] = val
测试:
array = [25, 67, 54, 33, 20, 78, 65, 49, 17, 56, 44]
insert_sort(array)
print array
时间和空间复杂度:O(n**2) O(1)
04.希尔排序
不是重点 不写了 有空再补上吧
05.归并排序
提炼问题:8 4 2 1
分析:两两合并 然后递归
代码:
def merge(list_l,list_r):
point_l = 0
point_r = 0
res = []
while point_l < len(list_l) and point_r < len(list_r):
if list_l[point_l] < list_r[point_r]:
res.append(list_l[point_l])
point_l += 1
else:
res.append(list_r[point_r])
point_r += 1
res += list_l[point_l:]
res += list_r[point_r:]
return res
def merge_sort(lst):
if len(lst) <= 1:
return lst
middle = len(lst)//2
left = merge_sort(lst[:middle])
right = merge_sort(lst[middle:])
return merge(left,right)
array = [25,67,54,33,20,78,65,49,17,56,44]
print merge_sort(array)
06.快速排序
代码:
# -*- coding:utf-8 -*-
def quick_sort(lst):
quick_sort_rec(lst,0,len(lst)-1)
def quick_sort_rec(lst,first,last):
if first < last:
split_point = partition(lst,first,last)
quick_sort_rec(lst,first,split_point-1)
quick_sort_rec(lst,split_point+1,last)
def partition(lst,first,last):
pivot_value = lst[first]
left_mark = first + 1
right_mark = last
done = False
while not done:
while left_mark <= right_mark and lst[left_mark] <= pivot_value:
left_mark = left_mark + 1
while lst[right_mark] >= pivot_value and right_mark >= left_mark:
right_mark = right_mark - 1
if right_mark < left_mark:
done = True
else:
temp = lst[left_mark]
lst[left_mark] = lst[right_mark]
lst[right_mark] = temp
temp = lst[first]
lst[first] = lst[right_mark]
lst[right_mark] = temp
return right_mark
array = [54, 26, 93, 17, 77, 31, 44, 55, 20]
quick_sort(array)
print array
07.堆排序
留到二叉树部分
08-10.基数排序、桶排序、计数排序 基本用不到 用到再聊吧 桶排序可能会有