![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 72
iuyo89007
IT界的婴儿
展开
-
最大子数组问题
最大子数组问题就是求数组中和最大的非空连续子数组。比如13, -3, -25, 20, -3, -16, -23, 18, 20, -7, 12, -5, -22, 15, -4, 7的最大子数组就是18, 20, -7, 12。下面分别用三种方法来求解此问题。定义全局最大子数组结构体://最大子数组结构struct MaxSubArray{ int max_left; //原创 2013-12-12 00:34:32 · 763 阅读 · 0 评论 -
快速选择算法
快速选择算法是根据快速排序的划分过程得来,它主要用于在O(n)时间内选择出一组序列的第i个顺序统计量,即第i个最大或最小的数。对于在一组无序的序列中找出第i个顺序统计量,我们可以把序列进行排序即可,但是最小的时间复杂度是O(nlogn),另外一种方法就是在此说的快速选择算法。我们可以回想一下快速排序的partition过程,该过程返回枢纽元素的位置i,那么就可说明比枢纽元素小的元素有i-1原创 2014-01-13 10:29:01 · 3597 阅读 · 1 评论 -
程序猿找工作必练内功:排序算法大总结(二)——归并排序算法
归并排序算法利用合并的思想,先将序列拆分为两部分分别排序,再将两个有序序列合并为一个有序序列从而达到排序的目的。它的时间复杂度为O(nlgn),空间复杂度为O(n)。归并排序的思想对于要比较序列中任意两个元素的问题提供了一个比O(n^2)快速的解决方案。比如求序列的逆序数(http://blog.csdn.net/iuyo89007/article/details/17208949),求序列中原创 2013-12-21 13:43:30 · 740 阅读 · 0 评论 -
利用归并排序求解序列中和为X的数有几对
如果序列是乱序的,求一个序列中和为X的数有几对,可以修改归并排序的合并过程即可,因为合并的过程中比较了任意的两个数。这种思想当然用来求差为x,乘积为x,商为x等类似问题依然有效。时间复杂度为O(nlgn)。当然也可以先对序列排序(任何排序算法也可以),再从序列两头向中间扫描,也可解决问题,详细请见http://blog.csdn.net/v_july_v/article/details/641原创 2013-12-20 22:12:32 · 630 阅读 · 0 评论 -
程序猿找工作必练内功:排序算法大总结(六)——shell排序
shell排序由插入排序得来。插入排序的每个元素之间的间隔是1,而shell排序的每个元素的间隔是k(k>=1)。shell排序将待排序的序列以间隔k分成多个分组,对每个分组分别应用插入排序进行排序,最后再以k=1排序整个序列(相当于插入排序)。我们知道,如果一个序列是基本有序的,则应用插入排序能获得好的性能,shell排序就是利用了这个原理。shell排序先使用一组互素的k将序列排序成基本有序,原创 2014-01-02 18:37:37 · 974 阅读 · 0 评论 -
程序猿找工作必练内功:排序算法大总结(一)——简单排序算法
今年找工作的过程中,笔试面试没少遇到排序算法,自以为熟记于心,但一写到纸上,就连自己都看不下去,唉!!这几天,我好好的把排序算法总结了一下,重新编程运行了,而且写成博客,希望以后找工作的同学们能及早修炼内功,切勿重蹈小弟的覆辙!下面是插入排序、选择排序和冒泡排序的递归和非递归程序,时间复杂度都是O(n2),空间复杂度都是O(1), 都是稳定的,都是原址排序。这些排序算法比较简单,因此统称简单排原创 2013-12-18 22:11:39 · 605 阅读 · 0 评论 -
利用归并排序求有限序列的逆序数
求有限序列的逆序数对的个数逆序数对:在一个序列A={a1, a2, … , an}中,满足ii>aj的一对元素称为一个逆序数对。那么,怎么求出一个序列的逆序数对的个数呢?最简单的方法就是顺序扫描序列,求出每个元素的逆序数对,累加即可,时间复杂度是O(n2)。下面我介绍一种时间复杂度是O(nlgn)(注:lgn=log2n)的算法,它由归并排序修改而来。在归并排序的合并过程中,左原创 2013-12-08 23:24:52 · 845 阅读 · 0 评论 -
程序猿找工作必练内功:排序算法大总结(五)——线性时间排序算法(计数排序,基数排序,桶排序)
前几篇关于排序的博客中所讲的排序算法的下界都是O(nlogn),原创 2013-12-31 23:03:58 · 652 阅读 · 0 评论 -
程序猿找工作必练内功:排序算法大总结(四)——快速排序算法
快速排序采用分治思想,选择一个枢纽元素k,用k将一个数组划分为左右两部分,左部分小于等于k,右部分大于等于k,再对两边分别进行t同样的划分,直到划分的数组子区间的长度为1,此时已完成数组的排序。快排的平均时间复杂度是O(nlogn),最坏时间复杂度是O(n^2),空间复杂都是O(n)。快排的性能取决于数组元素的分布,分布越随机,划分就越平衡,性能就好,反之越差。但是,实际中的数组很难做到随机分原创 2013-12-29 20:54:35 · 498 阅读 · 0 评论 -
新解全排列的递归实现
我们在手动计算n个数的全排列的过程一般就是以第i(0的一样,如此递归下去,就会形成一棵树。最后就会形成一个森林,该森林的所有叶子个数就是全排列的个数,根到每个叶子的所有节点构成的序列就是一个排列。如1,2,3的全排列如下图所示:在上图每幅图中,求以树根为开头的全排列,就是求其余的数的全排列,比如:要求1开头的全排列,求出2和3的全排列就行。因此,将树根依次和自己的孩子交换,再求原创 2013-12-09 21:57:58 · 621 阅读 · 0 评论 -
分治算法求解n介方阵相乘(Strassen)
这两天在看《算法导论》第4章,看到有关Strassen算法和递归式求解的内容,着实让小弟头疼了一把。经典就是经典,几十年前就出现的算法,到现在仍旧让人连连称赞,看来学生还得继续奋斗啊!!!看了一天多,还是没把全部内容参透,就简单把Strassen算法跟大家分享一下,希望大家多多指点。两个n介方阵相乘,最简单的算法就是使用三层for循环求解,时间复杂度是O(n3),在此不再详述。第二种算原创 2013-12-15 23:54:32 · 1924 阅读 · 1 评论 -
程序猿找工作必练内功:排序算法大总结(三)——堆排序算法
堆排序算法依靠堆的性质来达到排序的目的,此处的堆不同于程序中的堆,此处的堆的逻辑形态是一棵完全二叉树,树根的值大于左右孩子的值,子树也满足这个性质,这样的堆称为大顶堆,反之成为小顶堆。因此堆顶的元素就是最大或最小的元素。因此,给定一个有n个元素的序列,就可根据堆的形态和性质把序列调整为一个堆,然后交换堆的堆顶元素和堆的最后元素,再对长度为n-1的序列进行堆调整,直到序列长度为1,此时序列已排好序。原创 2013-12-26 22:31:57 · 762 阅读 · 0 评论