关于递归排序和快速排序的衍生思考
一、分治算法
分而治之,即把原问题分割成同等结构的子问题,之后针对子问题逐一解决。
插入排序更关心的是治。
归并排序更关心的是分,如何均匀分的问题。
二、分治算法应用---求逆序数
1. 什么是逆序数?
排在前面的元素比后面大。例如:序列 3 5 6 8 1 ;8排在1前面,但是8 > 1。逆序数反映的是一个序列有序程度,极端情况下,全部顺序的有序序列的逆序数是0;
从大到小排列的有序序列的逆序数最大。
way 1: 暴力解决。
way 2:用分治法求每个元素在它前面比它大的数,一只总逆序对数为每个数字前比它大的数字个数之和。
三、分治算法应用---n个元素序列中第k个大的元素
归并排序有个性质,就是每趟排序,能确定一个元素最终的位置,并且这个位置左边的元素都小于它,右边的元素都大于他。
我们可以在数组中产生一个随机的下标,让他作为一个标志,然后我们可以先将比改下标对应的元素大的放在该下标所对应的元素放在左边区间,小的放在右边区间。
然后我们可以模仿二分查找来寻找第k个大的元素,首先我们在将大的元素放在左边区间的循环中加入一个计数器,我们可以统计在标志下标左边区间的元素数量是多少,既然我们要找的是第k个大的元素,我们可以将k与计数器比较,如果小于左边区间的元素个数,那么第k个大的元素必然在左区间,我们就可以使用递归继续找,反之,如果大于计数器说明在右边区间,我们就递归右边区间即可。