├── README.md └── Sort └── python ├── BubbleSort.py ├── HeapSort.py ├── InsertionSort.py ├── MergeSort.py ├── QuickSort.py ├── SelectionSort.py ├── ShellSort.py ├── __init__.py └── main.py /README.md: -------------------------------------------------------------------------------- 1 | Algorithm-Interview 2 | =================== 3 | 4 | 经典算法&面试题的源代码实现项目 5 | -------------------------------------------------------------------------------- /Sort/python/BubbleSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:冒泡排序 5 | # 版本:0.1 6 | # 作者:WuChong 7 | # 日期:2014-01-28 8 | # 语言:Python 3.3 9 | # 说明:冒泡排序,从小到大排序,以及加了两种优化 10 | #--------------------------------------- 11 | 12 | def bubble_sort(ary): 13 | n = len(ary) #获得数组的长度 14 | for i in range(n): 15 | for j in range(1,n-i): 16 | if ary[j-1] > ary[j] : #如果前者比后者大 17 | ary[j-1],ary[j] = ary[j],ary[j-1] #则交换两者 18 | return ary 19 | 20 | 21 | #优化1:某一趟遍历如果没有数据交换,则说明已经排好序了,因此不用再进行迭代了。 22 | #用一个标记记录这个状态即可。 23 | def bubble_sort2(ary): 24 | n = len(ary) 25 | for i in range(n): 26 | flag = 1 #标记 27 | for j in range(1,n-i): 28 | if ary[j-1] > ary[j] : 29 | ary[j-1],ary[j] = ary[j],ary[j-1] 30 | flag = 0 31 | if flag : #全排好序了,直接跳出 32 | break 33 | return ary 34 | 35 | #优化2:记录某次遍历时最后发生数据交换的位置,这个位置之后的数据显然已经有序了。 36 | # 因此通过记录最后发生数据交换的位置就可以确定下次循环的范围了。 37 | def bubble_sort3(ary): 38 | n = len(ary) 39 | k = n #k为循环的范围,初始值n 40 | for i in range(n): 41 | flag = 1 42 | for j in range(1,k): #只遍历到最后交换的位置即可 43 | if ary[j-1] > ary[j] : 44 | ary[j-1],ary[j] = ary[j],ary[j-1] 45 | k = j #记录最后交换的位置 46 | flag = 0 47 | if flag : 48 | break 49 | return ary -------------------------------------------------------------------------------- /Sort/python/HeapSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:堆排序 5 | # 版本: 6 | # 作者:WuChong 7 | # 日期:2014-02-09 8 | # 语言:Python 3.3 9 | # 说明: 10 | #--------------------------------------- 11 | 12 | def heap_sort(ary) : 13 | n = len(ary) 14 | first = int(n/2-1) #最后一个非叶子节点 15 | for start in range(first,-1,-1) : #构造大根堆 16 | max_heapify(ary,start,n-1) 17 | for end in range(n-1,0,-1): #堆排,将大根堆转换成有序数组 18 | ary[end],ary[0] = ary[0],ary[end] 19 | max_heapify(ary,0,end-1) 20 | return ary 21 | 22 | 23 | #最大堆调整:将堆的末端子节点作调整,使得子节点永远小于父节点 24 | #start为当前需要调整最大堆的位置,end为调整边界 25 | def max_heapify(ary,start,end): 26 | root = start 27 | while True : 28 | child = root*2 +1 #调整节点的子节点 29 | if child > end : break 30 | if child+1 <= end and ary[child] < ary[child+1] : 31 | child = child+1 #取较大的子节点 32 | if ary[root] < ary[child] : #较大的子节点成为父节点 33 | ary[root],ary[child] = ary[child],ary[root] #交换 34 | root = child 35 | else : 36 | break -------------------------------------------------------------------------------- /Sort/python/InsertionSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:直接插入排序 5 | # 版本:0.1 6 | # 作者:WuChong 7 | # 日期:2014-01-29 8 | # 语言:Python 3.3 9 | # 说明: 10 | #--------------------------------------- 11 | 12 | def insert_sort(ary): 13 | n = len(ary) 14 | for i in range(1,n): 15 | if ary[i] < ary[i-1]: 16 | temp = ary[i] 17 | index = i #待插入的下标 18 | for j in range(i-1,-1,-1): #从i-1 循环到 0 (包括0) 19 | if ary[j] > temp : 20 | ary[j+1] = ary[j] 21 | index = j #记录待插入下标 22 | else : 23 | break 24 | ary[index] = temp 25 | return ary 26 | -------------------------------------------------------------------------------- /Sort/python/MergeSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:归并排序 5 | # 版本: 6 | # 作者:WuChong 7 | # 日期:2014-02-08 8 | # 语言:Python 3.3 9 | # 说明:归并的思想就是先递归分解,再合并数组 10 | #--------------------------------------- 11 | 12 | def merge_sort(ary): 13 | if len(ary) <= 1 : return ary 14 | num = int(len(ary)/2) #二分分解 15 | left = merge_sort(ary[:num]) 16 | right = merge_sort(ary[num:]) 17 | return merge(left,right) #合并数组 18 | 19 | def merge(left,right): 20 | '''合并操作, 21 | 将两个有序数组left[]和right[]合并成一个大的有序数组''' 22 | l,r = 0,0 #left与right数组的下标指针 23 | result = [] 24 | while l= right : return ary 18 | key = ary[left] #取最左边的为基准数 19 | lp = left #左指针 20 | rp = right #右指针 21 | while lp < rp : 22 | while ary[rp] >= key and lp < rp : 23 | rp -= 1 24 | while ary[lp] <= key and lp < rp : 25 | lp += 1 26 | ary[lp],ary[rp] = ary[rp],ary[lp] 27 | ary[left],ary[lp] = ary[lp],ary[left] 28 | qsort(ary,left,lp-1) 29 | qsort(ary,rp+1,right) 30 | return ary -------------------------------------------------------------------------------- /Sort/python/SelectionSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:选择排序 5 | # 版本: 6 | # 作者:WuChong 7 | # 日期:2014-02-08 8 | # 语言:Python 3.3 9 | # 说明: 10 | #--------------------------------------- 11 | 12 | def select_sort(ary): 13 | n = len(ary) 14 | for i in range(0,n): 15 | min = i #最小元素下标标记 16 | for j in range(i+1,n): 17 | if ary[j] < ary[min] : 18 | min = j #找到最小值的下标 19 | ary[min],ary[i] = ary[i],ary[min] #交换两者 20 | return ary 21 | 22 | 23 | -------------------------------------------------------------------------------- /Sort/python/ShellSort.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:希尔排序 5 | # 版本: 0.1 6 | # 作者:WuChong 7 | # 日期:2014-02-08 8 | # 语言:Python 3.3 9 | # 说明: 10 | #--------------------------------------- 11 | 12 | def shell_sort(ary): 13 | n = len(ary) 14 | gap = round(n/2) #初始步长 , 用round四舍五入取整 15 | while gap > 0 : 16 | for i in range(gap,n): #每一列进行插入排序 , 从gap 到 n-1 17 | temp = ary[i] 18 | j = i 19 | while ( j >= gap and ary[j-gap] > temp ): #插入排序 20 | ary[j] = ary[j-gap] 21 | j = j - gap 22 | ary[j] = temp 23 | gap = round(gap/2) #重新设置步长 24 | return ary -------------------------------------------------------------------------------- /Sort/python/__init__.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序: 5 | # 版本: 6 | # 作者:WuChong 7 | # 日期:2014-01-28 8 | # 语言:Python 3.3 9 | # 说明: 10 | #--------------------------------------- -------------------------------------------------------------------------------- /Sort/python/main.py: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | 3 | #--------------------------------------- 4 | # 程序:排序总控程序 5 | # 版本: 6 | # 作者:WuChong 7 | # 日期:2014-01-28 8 | # 语言:Python 3.3 9 | # 说明:自动随机50个1-99之间数,并调用排序算法进行排序 10 | #--------------------------------------- 11 | 12 | import random 13 | import Sort.BubbleSort 14 | import Sort.InsertionSort 15 | import Sort.ShellSort 16 | import Sort.SelectionSort 17 | import Sort.MergeSort 18 | import Sort.QuickSort 19 | import Sort.HeapSort 20 | 21 | arry = [random.randint(1,99) for i in range(20)] 22 | 23 | print("排序前:"+str(arry)) 24 | 25 | sorted_arry = Sort.HeapSort.heap_sort(arry) 26 | 27 | print("排序后:"+str(sorted_arry)) --------------------------------------------------------------------------------