Divide and Conquer~ 计算inversions
2014-11-21 10:24
211 查看
The code is built on piggybacking on Merge Sort:
x = 0 def mergesort(arr): global x if len(arr) == 1: return arr else: mid = len(arr) / 2 left = mergesort(arr[:mid]) right = mergesort(arr[mid:]) left_cnt, right_cnt, arr_cnt = 0, 0, 0 while left_cnt < len(left) and right_cnt < len(right): if left[left_cnt] < right[right_cnt]: arr[arr_cnt] = left[left_cnt] left_cnt += 1 else: arr[arr_cnt] = right[right_cnt] right_cnt += 1; x += (len(left) - left_cnt) ##this is the only difference~! arr_cnt += 1 while left_cnt < len(left): arr[arr_cnt] = left[left_cnt] left_cnt += 1; arr_cnt += 1 while right_cnt < len(right): arr[arr_cnt] = right[right_cnt] right_cnt += 1; arr_cnt += 1; return arr def main(): arr = [] fname = raw_input('please enter the filename:') fhand = open(fname) for line in fhand: line.rstrip() arr.append(int(line)) mergesort(arr) print 'x is the number of inversions in the array: ' print x main()
相关文章推荐
- leetcode_c++:Divide and Conquer:Count of Smaller Numbers After Self(315)
- Divide and conquer algorithm
- 154. Find Minimum in Rotated Sorted Array II (Array; Divide-and-Conquer)
- Divide and Conquer
- Divide and Conquer:River Hopscotch(POJ 3258)
- Divide and Conquer -- Leetcode problem53. Maximum Subarray
- [TreeDivideAndConquer]点分治
- 分治法——树的遍历(Divide and Conquer - Tree Traversal)
- 第八章 Divide and Conquer with Splitters
- SGU 229 Divide and conquer(模拟)
- Scala 编程中分而治之的思想 (divide and conquer)
- 漫谈算法(四)分治算法 Divide and Conquer Algorithm
- [week 14][Leetcode][Divide and Conquer] Majority Element
- leetcode_c++:Divide and Conquer:Count of Range Sum(327)
- Divide and Conquer -- Leetcode problem169: Majority Element
- [Leetcode刷题总结系列][Dynamic programming][Divide-and-conquer]53.Maximum Subarray
- android开源项目DivideAndConquer中的小球碰撞问题
- Divide and Conquer -- Leetcode problem241:Different Ways to Add Parentheses
- Divide and conquer:Median(POJ 3579)
- Divide and Conquer Transactional Replication using Tracer Tokens