数据结构与算法
ligt0610
这个作者很懒,什么都没留下…
展开
-
【微创】求整数的二进制表示中有多少个1
现有一整数n,求n用二进制表示中有多少个1?解法一的步骤:(1)判定n是否为0,若为0,计算结束;否则继续计算(2)取n mod 2的值,若为1,计数器加1(3)对n进行除2,并返回到步骤(1)代码如下:int count1Bits(int n){ int count = 0; int mod = 0; //假设需要考虑负数 if (0 >原创 2012-02-11 16:05:12 · 791 阅读 · 0 评论 -
查找数组中第K大元素
前面几篇讨论了一些常用排序算法,在此基础上刚好可以讨论一下本篇的主题。在N个元素中查找第K大元素,一般比较简单的方法就是先快速排序,然后直接返回array[N - K]或者利用扫描法,每一次扫描都找到当前数组中最大的元素,这个其实就是部分冒泡排序。前一种算法的时间复杂度是O(NlogN),后一种算法的时间复杂度是K*N。当然,这里我们不打算具体讨论以上两种方案,接下来看看其他方法。原创 2012-09-10 17:20:18 · 8805 阅读 · 1 评论 -
常用排序算法递归篇之归并排序
合并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法的一个非常典型的应用。合并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。 将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。合并排序也叫归并排序。原创 2012-08-23 11:06:44 · 1125 阅读 · 0 评论 -
常用排序算法递归篇之快速排序
上一篇讲了几种非递归实现的常用排序算法,接下来把常用的几种用递归实现的排序算法也讲一下。本篇先讲快速排序,首先来描述一下快速排序的基本思想:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 快速排序的实现描述: 1、原创 2012-08-22 20:17:57 · 802 阅读 · 0 评论 -
常用排序算法非递归篇
一直以来,对于冒泡、插入、选择这样的简单排序算法都没有弄得特别清楚,总是弄混淆。趁着晚上有空,把相关的排序算法回忆一下并做个记录。接下来讲的排序算法都以对整数的排序为例: 冒泡排序的实现描述: 1、将所有待排序的整数放入数组中; 2、从数组的第一个数字到倒数第二个数字进行逐个检查:若某一位上的整数大于它的下一位,则将它与它的下一位交换; 3、原创 2012-08-16 19:57:36 · 800 阅读 · 0 评论 -
求集合的所有子集(续)
上一篇《求集合的所有子集》中给出的两种方法虽然解决了求所有子集的问题,但是也留下了一点缺陷,没法根据字典序输出所有子集。这里利用回溯法来求解,保证了按字典序输出所有子集。大致思路:首先得利用辅助数组index来记录所有选中元素的下标,对于辅助数组index需满足以下两个条件:(1)index[i + 1] > index[i],即后一个元素的下标必须大于前一个元素的下标(2)index原创 2012-03-31 18:42:29 · 3001 阅读 · 0 评论 -
求集合的所有子集
现有一个包含N个元素的集合S,求集合S的所有子集?例如:集合S包含三个元素{a, b, c},则它的所有子集为:{ }(空集), {a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}。这里先用位操作的思路来求解,具体方法:用2进制Bit位来标记集合中的某个元素是否被选中,1代表选中,0代表未选中。例如集合{a, b, c}的所有子集可如下表示:原创 2012-03-28 19:52:49 · 4413 阅读 · 0 评论 -
排列组合
给定一个n个不同元素的集合,列出所有的排列方式。例如:集合{a, b, c}的所有排列方式如下:{a, b, c}, {a, c, b}, {b, a, c}, {b, c, a}, {c, a, b}, {c, b, a}。n个不同元素的排列方式一共有n!种,这里提供一种递归的方法来解决这个问题。令E = {e1, e2, ......, en}表示n个不同元素的集合,Ei为E中移去原创 2012-03-02 20:01:22 · 697 阅读 · 0 评论 -
求比正整数N大的最小正整数M,且M与N的二进制表示中有相同数目的1
一般最容易想到的方法就是先计算正整数N用二进制表示时1的个数count1,然后不停地计算N++用二进制表示时1的个数count2,直到碰到count1 == count2成立,代码如下:typedef unsigned int uint; //解法一: uint count1Bits(uint n) { uint count = 0; while (0 != n)原创 2012-02-15 22:43:13 · 5341 阅读 · 1 评论 -
常用排序算法递归篇之堆排序
在讲堆排序之前,我们先来了解一下什么是堆,堆的定义如下: n个关键字序列array[0...n-1]称为(Heap),当且仅当该序列满足如下性质: array[i] =号。array[i]相当于二叉树的非叶结点,array[2i + 1]则是左孩子,array[2i + 2]是右孩子。 若将此序列array[0...n-1]看做是一棵完全二叉树,则堆实原创 2012-08-24 11:23:41 · 2854 阅读 · 0 评论