确定n个元素的任何排序中逆序对数量
2017-04-20 21:24
204 查看
《算法导论》第三版 P24,2-4思考题
这个算法是在归并排序算法的基础上改的。比较关键的一点是要清楚什么情况下是逆序及产生了多少逆序。
作者:李印臣,2005年毕业于山东师范大学计算机系,曾三次患有精神分裂症。康复后,做了近四年的软件工程师,然后做了两年精神分裂症领域的公益,现重新回到软件行业,一切从头再开始!
愿这个博客见证我的成长与进步。
list1 = [10,9,8,7,6,5,4,3,1,2]; count = len(list1); def mergeSort(list0, i, j): inversionNum = 0 if i < j: k = (int)((i + j) / 2) inversionNum = inversionNum + mergeSort(list0, i, k) inversionNum = inversionNum + mergeSort(list0, k + 1, j) inversionNum = inversionNum + merge(list0, i, k, j) return inversionNum def merge(list0, i, k, j): n1 = k - i + 1 n2 = j - k subList1 = [] subList2 = [] positiveSequenceNum = 0 inversionNum = 0 for a in range(0, n1): subList1.append(list0[i + a]) for a in range(0, n2): subList2.append(list0[k + 1 + a]) m1 = 0; m2 = 0; tmp1 = 0; tmp2 = 0; for a in range(i, j + 1): if m1 < n1: tmp1 = subList1[m1] if m2 < n2: tmp2 = subList2[m2] if tmp1 > tmp2 and m2 < n2: list0[a] = tmp2 inversionNum = inversionNum + n1 - positiveSequenceNum m2 = m2 + 1 else: if m1 < n1: list0[a] = tmp1 positiveSequenceNum = positiveSequenceNum + 1 m1 = m1 + 1 return inversionNum print(mergeSort(list1, 0, count - 1)); print(list1);
这个算法是在归并排序算法的基础上改的。比较关键的一点是要清楚什么情况下是逆序及产生了多少逆序。
作者:李印臣,2005年毕业于山东师范大学计算机系,曾三次患有精神分裂症。康复后,做了近四年的软件工程师,然后做了两年精神分裂症领域的公益,现重新回到软件行业,一切从头再开始!
愿这个博客见证我的成长与进步。
相关文章推荐
- 算法学习笔记----确定n个元素的任何排列中逆序对的数目
- 算法导论习题---求n个元素任何排列中逆序对的数量
- 改进合并排序法以查找元素序列中的逆序对数量,最坏运行时间O( nlog2(n) )
- 题目2.给出一个算法,它能用O(nlgn)的最坏情况运行时间,确定n个元素的任何排列中逆序对的数目
- 使用Linq确定序列是否包含任何元素
- leetcode 493. Reverse Pairs 归并排序统计逆序对数量 + 这个我估计是做不出来的,还是直接暴力吧
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- 使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- 为什么说任何基于比较的算法将 5 个元素排序都需要 7 次?
- PHP数组元素的顺序与逆序排序
- 对JSON数组对象排序-有键相同的元素,分组数量不一致,可采用如下的JS进行循环表格输出
- 将链表逆序排列的一个程序及思考的对链表依某一元素排序方法
- 笔试算法题(32):归并算法求逆序对 & 将数组元素转换为数组中剩下的其他元素的乘积
- 栈元素的排序
- 用7次比较完成5个元素的排序
- JS统计一个JSON元素数量
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- python list元素为dict时的排序
- 【php数组函数序列】之ksort()- 对数组的元素键名进行升序排序,保持索引关系