归并排序
首先归并排序使用了二分法,归根到底的思想还是分而治之。拿到一个长数组,将其不停的分为左边和右边两份,然后以此递归分下去。然后再将她们按照两个有序数组的样子合并起来。
两个有序数组排序的方法则非常简单,同时对两个数组的第一个位置进行比大小,将小的放入一个空数组,然后被放入空数组的那个位置的指针往后 移一个,然后继续和另外一个数组的上一个位置进行比较,以此类推。到最后任何一个数组先出栈完,就将另外i一个数组里的所有元素追加到新数组后面。
由于递归拆分的时间复杂度是logN 然而,进行两个有序数组排序的方法复杂度是N该算法的时间复杂度是N*logN 所以是NlogN。
def merge(list1, list2): tmp = [] i = 0 j = 0 while i < len(list1) and j < len(list2): if list1[i] < list2[j]: tmp.append(list1[i]) i += 1 else: tmp.append(list2[j]) j += 1 if i == len(list1): for t in list2[j:]: tmp.append(t) else: for t in list1[i:]: tmp.append(t) return tmp def merge_sort(list): if len(list) < 2: return list mid = int(len(list) / 2) left = merge_sort(list[:mid]) right = merge_sort(list[mid:]) return merge(left, right) if __name__ == '__main__': list = [32, 13, 28, 5, 23, 56, 12, 78, 34, 1, 67, 4] result = merge_sort(list) print(result)