Python实现冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法(基于《算法导论》伪代码)
2016-02-17 10:11
1161 查看
为加深对各种基础排序算法的理解,我基于Thomas H. Cormen等《算法导论》中的伪代码,用Python实现了冒泡排序、选择排序、插入排序、快速排序、归并排序、二分法查找算法。
具体算法如下:
冒泡排序:
选择排序
插入排序
快速排序
归并排序
二分查找
具体算法如下:
冒泡排序:
def bubbleSort(alist): for passnum in range(0, len(alist) - 1, 1): for i in range(0, len(alist) - passnum - 1, 1): if (alist[i] > alist[i+1]): tmp = alist[i+1] alist[i+1] = alist[i] alist[i] = tmp alist = [54,26,93,17,77,31,44,55,20] bubbleSort(alist) print(alist)
选择排序
def selectionSort(alist): for i in range(0, len(alist), 1): min = alist[i] index = i for j in range(i, len(alist), 1): if ( alist[j] < min): min = alist[j] index = j tmp = alist[i] alist[i] = min alist[index] = tmp alist = [54,26,93,17,77,31,44,55,20] selectionSort(alist) print(alist)
插入排序
def insertionSort(alist): for i in range(1, len(alist), 1): j = i - 1 key = alist[i] while (j >= 0 and alist[j] > key): alist[j+1] = alist[j] j = j - 1 alist[j + 1] = key alist = [54,26,93,17,77,31,44,55,20] insertionSort(alist) print(alist)
快速排序
from math import floor def partitions(alist, p, r): print ('start: ' + str(p)) print ('end: ' + str(r)) i = p - 1 pivot = alist[r] for j in range(p, r, 1): if (alist[j] < pivot): i = i + 1 tmp = alist[j] alist[j] = alist[i] alist[i] = tmp tmp = alist[r] alist[r] = alist[i + 1] alist[i + 1] = tmp print ('q: ' + str(i + 1)) return i + 1 def quickSort(alist, p, r): if (p < r): q = partitions(alist, p, r) quickSort(alist, p, q - 1) quickSort(alist, q + 1, r) alist = [54,26,93,17,77,31,44,55,20] quickSort(alist, 0, 8) print(alist) # notice the range(0, 10, 1) is {0,1,2,3,4,5,6,7,8,9} not include 10
归并排序
from math import floor def merge(alist, p, q, r): print ('start: ' + str(p)) print ('q: ' + str(q)) print ('end: ' + str(r)) n1 = q - p + 1 n2 = r - q left = [0]*(n1 + 1) right = [0]*(n2 + 1) for i in range(0, n1, 1): left[i] = alist[p + i] for j in range(0, n2, 1): right[j] = alist[q + j + 1] left[n1] = 100000 right[n2] = 100000 i = 0 j = 0 for k in range(p, r + 1, 1): if (left[i] <= right[j]): alist[k] = left[i] i = i + 1 else: alist[k] = right[j] j = j + 1 def mergeSort(alist, p, r): if (p < r): q = floor((p + r)/2) mergeSort(alist, p, q) mergeSort(alist, q + 1, r) merge(alist, p, q, r) alist = [54,26,93,17,77,31,44,55,20] mergeSort(alist, 0, 8) print(alist) # notice the range(0, 10, 1) is {0,1,2,3,4,5,6,7,8,9} not include 10
二分查找
from math import floor def binarySearch(alist, n, low, high): if (low < high): mid = floor((high + low)/2) if (alist[mid] > n): binarySearch(alist, n, low, mid) else: binarySearch(alist, n, mid + 1, high) if (alist[mid] == n): print (mid) return mid alist = [1,2,3,4,5,6,7,8] binarySearch(alist, 6, 0, 7)
相关文章推荐
- Python变量常量命名
- Python数据类型
- 如何形象地理解 Python 中的 int 类型是任意精度这一概念?
- Python的functools.reduce用法
- Python 输入输出
- python idle 错误 subprocess didn't make connection
- python3.0学习四 隐藏访问浏览器
- python获取天气预报程序第一版(齐齐哈尔市内一周天气)
- Python 2.x vs Python 3(三)
- Python subprocess子进程(程序调用)模块
- Python 各种测试框架简介
- 使用python实现rsa算法代码
- python实现RSA加密(解密)算法
- Using Django with GAE Python 后台抓取多个网站的页面全文
- Python 爬虫爬取指定博客的所有文章
- 玩转python爬虫之cookie使用方法
- 玩转python爬虫之URLError异常处理
- 玩转python爬虫之正则表达式
- 玩转python爬虫之爬取糗事百科段子
- Python多线程、异步+多进程爬虫实现代码