zoukankan      html  css  js  c++  java
  • 关于归并排序和快速排序的衍生思考

    一、分治算法

         分而治之,即把原问题分割成同等结构的子问题,之后针对子问题逐一解决。

         归并排序更关心的是治。

         快速排序更关心的是分,如何均匀分的问题,它有一个pivot,如何合理的均分。

    二、分治算法应用---求逆序数

      1. 什么是逆序数?

        排在前面的元素比后面大。例如:序列  3 5 6 8 1 ;8排在1前面,但是8  > 1。逆序数反映的是一个序列有序程度,极端情况下,全部顺序的有序序列的逆序数是0;

    从大到小排列的有序序列的逆序数最大。

       way 1: 暴力解决。

       way 2:用分治法求每个元素在它前面比它大的数,一只总逆序对数为每个数字前比它大的数字个数之和。

    三、分治算法应用---n个元素序列中第k个大的元素

       归并排序有个性质,就是每趟排序,能确定一个元素最终的位置,并且这个位置左边的元素都小于它,右边的元素都大于他。 

    我们可以在数组中产生一个随机的下标,让他作为一个标志,然后我们可以先将比改下标对应的元素大的放在该下标所对应的元素放在左边区间,小的放在右边区间。

    然后我们可以模仿二分查找来寻找第k个大的元素,首先我们在将大的元素放在左边区间的循环中加入一个计数器,我们可以统计在标志下标左边区间的元素数量是多少,既然我们要找的是第k个大的元素,我们可以将k与计数器比较,如果小于左边区间的元素个数,那么第k个大的元素必然在左区间,我们就可以使用递归继续找,反之,如果大于计数器说明在右边区间,我们就递归右边区间即可。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    

      

  • 相关阅读:
    【python cookbook】【数据结构与算法】12.找出序列中出现次数最多的元素
    [转]ASP.NET MVC 5
    [转]ASP.NET MVC 5 学习教程:快速入门
    Using XSLT and Open XML to Create a Word 2007 Document
    如何在VS2010中更好的编写JavaScript代码
    [转]这五种方法前四种方法只支持IE浏览器,最后一个方法支持当前主流的浏览器(火狐,IE,Chrome,Opera,Safari)
    [转]C# 超高速高性能写日志 代码开源
    windows 2003 发布遇到问题---分析器错误消息: 未能加载类型“YWPT.MvcApplication”。
    将Oracle数据库转换为SQL Server
    SQLServer2008导出表数据为SQL脚本
  • 原文地址:https://www.cnblogs.com/juanzhi/p/12313795.html
Copyright © 2011-2022 走看看