摘要:
比较排序和顺序时间排序总结 笔者前面在之前的博客当中已经说明了几种经常遇到的排序算法,分别是:插入排序、归并排序、堆排序、快速排序,现在分别对它们的基本思路进行一次复习。 1、插入排序 基本思路:对于一个数组(下标从0开始,下同)当中的下标为i的数,如果前面的i个数已经排好序的话,那么只需要在前i个 阅读全文
摘要:
整型数组中各元素拼合成最大数字问题 身边两位找工作的同学遇到了一个同样的笔试题:给定一个非负的整数数组,找出由其中的数字拼接成的最大数,如[1,23,2,6,7]找出来的数字是762321。我在网上找到一个解决方案,并且用C++实现了如下程序: 阅读全文
摘要:
版权声明:本文为博主原创文章,未经博主允许不得转载。 快速排序的C++实现 partition函数的运行过程使用一个例子来帮助理解。对数组[6, 10, 10, 3, 7 ,1,8]运行一次Partition函数的过程如下图(有黄色填充的部分代表主元)所示: 其中i和j分别是程序当中的两个下标,j的 阅读全文
摘要:
堆排序C++实现 堆排序的具体思路可以查看《算法导论》这本书,一下只提供笔者的C++实现代码,并且将笔者在编写程序的过程当中所遇到的一些细节问题拿出来作一番解释,希望能够对对堆排序有一个透彻的理解。 1、构造一个维护堆性质(最大堆)的函数 这里需要做一个假设:对于数组中下标为i的节点其左子树和右子树 阅读全文
摘要:
有两个复数m=a+b*i,n=c+d*i,现在计算它们的乘法,设计一个只使用三次实数乘法的算法来完成m和n的计算。 根据复数乘法的计算公式:m*n=(a*c-b*d)+(a*d+b*c)i,可以使用加法或者减法来削减乘法运算的数量。 计算C1=a*d,C2=b*c,C3=(a+b)(c-d),虚部为 阅读全文
摘要:
求解最大连续子数组的内容在《算法导论》这本书上面是作为分治算法的一个例子来进行讲解的,书本上面内容(包括习题)提到了三种解决这一问题的算法,下面是我自己使用C++实现这三种方法的代码和思路放: 一、暴力解法 对数组内每一个数A[i]进行遍历,然后遍历以它们为起点的子数组,比较各个子数组的大小,找到最 阅读全文
摘要:
最近在看《算法导论》这本书,在练习题当中发现了这样的一个问题:使用二分查找法来实现插入排序,由于之前的内容当中有讲解二分法的递归实现,所以在这便将它们结合起来希望解决这个问题。闲话不多说了,直接上代码: 算法思路很简单,无非是将原来的线性查找被排序元素的合适的位置的部分换成了使用二分法来查找合适的位 阅读全文