python基础查漏补缺6--排序算法
#! /usr/bin/env python3 # -*- coding=utf-8 -*- ''' @Date: 2017-10-10 @Author: Henry Python各种排序算法 ''' def bubble_sort(ls): ''' 冒泡排序 ''' if ls == None: return [] else: for j in range(len(ls)-1): for k in range(len(ls)-j-1): if ls[k] > ls[k+1]: ls[k], ls[k+1] = ls[k+1], ls[k] return ls def fast_sort(ls): ''' 使用python的列表生成式的快速排序 ''' if len(ls) < 2: return ls else: return fast_sort([x for x in ls[1:] if x <= ls[0]]) \ + [ls[0]] + fast_sort([y for y in ls[1:] if y > ls[0]]) ''' 标准快速排序 ''' def partition(L, first, last): pivot = L[first] leftmark = first + 1 rightmark = last while True: while L[leftmark] <= pivot: if leftmark == rightmark: break leftmark += 1 while L[rightmark] > pivot: rightmark -= 1 if leftmark < rightmark: L[leftmark], L[rightmark] = L[rightmark], L[leftmark] else: break L[first], L[rightmark] = L[rightmark], L[first] return rightmark def rand_partition(L, first, last): ''' 随机取得比较用的随机值 ''' import random rand_num = random.randint(first, last) L[first], L[rand_num] = L[rand_num], L[first] pivot = L[first] leftmark = first + 1 rightmark = last while True: while L[leftmark] <= pivot: if leftmark == rightmark: break leftmark += 1 while L[rightmark] > pivot: rightmark -= 1 if leftmark < rightmark: L[leftmark], L[rightmark] = L[rightmark], L[leftmark] else: break L[first], L[rightmark] = L[rightmark], L[first] return rightmark def std_quick_sort(L, first, last): if first < last: split = partition(L, first, last) # split = rand_partition(L, first, last) std_quick_sort(L, first, split-1) std_quick_sort(L, split+1, last) def stdQuickSort(L): std_quick_sort(L, 0, len(L)-1) # 标准快速排序结束 ''' 选择排序,每次从剩余列表中选择最大值放在最后面,冒泡排序的升级,减少了swap操作 ''' def selection_sort(L): for pos in range(len(L)-1, 0, -1): positionMax = 0 for location in range(1, pos+1): if L[location] > L[positionMax]: positionMax = location L[pos], L[positionMax] = L[positionMax], L[pos] ''' 插入排序 ''' def insertion_sort(alist): for index in range(1, len(alist)): currentvalue = alist[index] position = index while position > 0 and alist[position-1] > currentvalue: alist[position] = alist[position-1] position = position - 1 alist[position] = currentvalue ''' shell 排序 ''' def shell_sort(alist): sublist_count = len(alist) // 2 while sublist_count > 0: for startposition in range(sublist_count): gap_insertion_sort(alist, startposition, sublist_count) sublist_count = sublist_count // 2 def gap_insertion_sort(alist, start, gap): for index in range(start, len(alist), gap): currentvalue = alist[index] position = index while position > start and alist[position-gap] > currentvalue: alist[position] = alist[position-gap] position = position - gap alist[position] = currentvalue ''' 归并排序 ''' def merge_sort(alist): if len(alist) < 2: return alist middle = len(alist) // 2 left = merge_sort(alist[:middle]) right = merge_sort(alist[middle:]) return merge(left, right) def merge(left, right): i = 0 j = 0 k = 0 result = [] while i < len(left) and j < len(right): if left[i] < right[j]: result.append(left[i]) i += 1 else: result.append(right[j]) j += 1 k += 1 result += right[j:] result += left[i:] return result if __name__ == '__main__': # print(bubble_sort([])) # print(bubble_sort([2, 1, 3, 45, 5, 5])) # print(fast_sort([2, 1, 3, 45, 5, 5])) # print(fast_sort([2, 2, 2, 2])) import random ls = [random.randint(1, 100) for x in range(0, 100)] # import time # t1 = time.time() # stdQuickSort(ls) # # print(ls) # t2 = time.time() # print(t2 - t1) # selection_sort(ls) # insertion_sort(ls) # shell_sort(ls) print(merge_sort(ls))